文章目录
1. 大致架构
流程描述:
- 用户通过接入方(应用)登录,接入方采取OAuth2.0方式在统一认证服务(UAA)中认证。
- 认证服务(UAA)调用验证该用户的身份是否合法,并获取用户权限信息。
- 认证服务(UAA)获取接入方权限信息,并验证接入方是否合法。
- 若登录用户以及接入方都合法,认证服务生成jwt令牌返回给接入方,其中jwt中包含了用户权限及接入方权 限。
- 后续,接入方携带jwt令牌对API网关内的微服务资源进行访问。
- API网关对令牌解析、并验证接入方的权限是否能够访问本次请求的微服务。
- 如果接入方的权限没问题,API网关将原请求header中附加解析后的明文Token,并将请求转发至微服务。
- 微服务收到请求,明文token中包含登录用户的身份和权限信息。因此后续微服务自己可以干两件事:
- 用 户授权拦截(看当前用户是否有权访问该资源)
- 将用户信息存储进当前线程上下文(有利于后续业务逻辑随时 获取当前用户信息)
2. OAuth2.0 介绍
2.1 简介
- OAuth(开放授权)是一个开放标准
- 允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不 需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。
- OAuth2.0是OAuth协议的延续版本,但不向 后兼容OAuth 1.0即完全废止了OAuth1.0。很多大公司如Google,Yahoo,Microsoft等都提供了OAUTH认证服 务,这些都足以说明OAUTH标准逐渐成为开放资源授权的标准。
举例说明:
- 很多网站都支持 微信、QQ 登录,不需要单独在当前网站创建账号。
- 这就是网站利用了微信、QQ 的认证信息进行认证,这里微信、QQ中的认证信息就是用户存储在第三方服务中的数据。
- 只要用户在本网站登录上 微信、QQ账号,即表示用户同意本网站去获取存储在微信中的用户数据
- 只要用户一同意,那么微信、QQ 就会生成一个当前用户在当前网站专门使用的一个令牌,有了令牌,当前网站就可以操作存储在 微信、QQ 中的用户数据
2.2 执行流程
程序执行流程图:
- 客户端请求第三方授权
- 资源拥有者同意给客户端授权
- 客户端获取到授权码,请求认证服务器申请令牌
- 认证服务器向客户端响应令牌
- 客户端请求资源服务器的资源
- 资源服务器返回受保护资源
2.3 相关角色
OAauth2.0包括以下角色:
-
客户端 本身不存储资源,需要通过资源拥有者的授权去请求资源服务器的资源,比如:Android客户端、Web客户端(浏 览器端)、微信客户端等。
-
资源拥有者 通常为用户,也可以是应用程序,即该资源的拥有者。
-
授权服务器(也称认证服务器)
用于服务提供商对资源拥有的身份进行认证、对访问资源进行授权,认证成功后会给客户端发放令牌 (access_token),作为客户端访问资源服务器的凭据。本例为微信的认证服务器。
-
资源服务器 存储资源的服务器,本例子为微信存储的用户信息。
- 现在还有一个问题,服务提供商能允许随便一个客户端就接入到它的授权服务器吗?
答案是否定的,
服务提供商会 给准入的接入方一个身份,用于接入时的凭据:- client_id:客户端标识
- client_secret:客户端秘钥
因此,准确来说,授权服务器对两种OAuth2.0中的两个角色进行认证授权,分别是资源拥有者、客户端
3. Spring Cloud Security OAuth2 环境介绍
OAuth2.0的服务提供方涵盖两个服务,即授权服务 (Authorization Server,也叫认证服务)和资源服务 (Resource Server),使用 Spring Security OAuth2 的时候你可以选择把它们在同一个应用程序中实现,也可以选择建立使用 同一个授权服务的多个资源服务。
- 授权服务 (Authorization Server)应包含对接入端以及登入用户的合法性进行验证并颁发token等功能,对令牌 的请求端点由 Spring MVC 控制器进行实现,下面是配置一个认证服务必须要实现的endpoints:
- AuthorizationEndpoint 服务于认证请求。默认 URL: /oauth/authorize 。
- TokenEndpoint 服务于访问令牌的请求。默认 URL: /oauth/token 。
- 资源服务 (Resource Server),应包含对资源的保护功能,对非法请求进行拦截,对请求中token进行解析鉴 权等,下面的过滤器用于实现 OAuth 2.0 资源服务:
- OAuth2AuthenticationProcessingFilter用来对请求给出的身份令牌解析鉴权
在实际应用时,需要将 授权服务(UAA)和 资源服务分开部署,所以后面的案例就会按照如下的流程执行:
认证流程如下:
- 客户端请求UAA授权服务进行认证。
- 认证通过后由UAA颁发令牌。
- 客户端携带令牌Token请求资源服务。
- 资源服务校验令牌的合法性,合法即返回资源信息。