建议
oauth2spring-authorization-rver分析
1. 选型
选⽤ spring curity 5.2.x+作为框架,在 spring curity 5.2.x+ 框架中进⾏扩展。
Spring 曾经有旧版⽀持 OAuth2 的⽅案:Spring Security OAuth 项⽬,该项⽬已经被逐步淘汰。但⽹上有不少仍然是这个⽅案,需要充分注意他们的区别。
1.1. Spring Security 5.
2.x+
1.1.1. 说明
spring curity 实现 OAuth 的框架分为 spring curity OAuth 项⽬和 spring curity 5.2.x ⾃带的 OAuth 功能,⽬前 spring curity OAuth 已作废,官⽅推荐使⽤ spring curity 5.2.x ⾃带的 OAuth
1.1.
2. Spring Security 5.2.x+⾃带 OAuth
spring curity 5.2.x+ 只有资源服务器和客户端,并不包含授权服务器,官⽅推荐使⽤ spring-authorization-rver,⽬前版本
0.2.1。
1.spring curity 5.
2.x+
项⽬地址:
2.授权服务器
1.1.3. Spring Security OAuth 项⽬
spring curity OAuth 项⽬已作废
项⽬地址:
1.1.4. 两个项⽬对⽐分析
2. 核⼼过滤链分析
幼儿园中班健康教案OAuth2 ⽅案,⽀持在单体应⽤下启⽤。在单体应⽤中使⽤时,该应⽤的⾓⾊将会同时为“授权服务器”和“资源服务器”。
单体应⽤下,应⽤会同时成为“授权服务器”和“资源服务器”。分别对应两条由 Spring Security 创建的过滤器链,⽤于处理授权请求和资源服务的鉴权安全。
2.1. 授权服务器 SecurityFilterChain 过滤链
配置类 AuthorizationServerSecurityAutoConfiguration
该过滤器链,会匹配下图的 URL 和 Method 的请求。
剪蝴蝶
在授权服务器的配置类⽣效后,将会对上图中的符合的 URL 和 Method 的请求进⾏拦截,也就是说,只要请求符合,都会进⼊这个过滤器链中被处理。
符合的请求,会经过上图中的过滤器链被处理。
过滤器链中包含⽐较多的过滤器,这⾥,⽐较重要的过滤器有如下介绍的。
2.1.1. OAuth2AuthorizationEndpointFilter
这个过滤器⽤来处理授权码认证过程中获取 code 的请求。
{{AuthorizationServer}}/oauth2/authorize?client_id=client&respon_type=code&scope=testScopewin10怎么取消开机密码
若请求成功,返回的 302 跳转路径是:
localhost:8080/callback?code=EuO9WT96cMPoTB777pTuEk9TW5kZEuX-WKwbtZBJfLoEUlfGLBBmceP_qsEuOiypnkDL_wO0FyNlc9qtAxupFSx0hR 这样,就能获取到授权码,进⾏下⼀步的认证了。
2.1.2. OAuth2ClientAuthenticationFilter
客户端认证过滤器,主要是对请求的客户端进⾏认证。⽆论 grant type 是授权码还是客户端认证,请
求中都会包含 client id 和 client cret。此过滤器就是确认客户端的 client id 和 client cret 是否正确。
与其他过滤器不同,如果客户端认证成功,会把客户端信息转为 Authentication 对象,保存在 SecurityContext 中,然后流转到下⼀个
过滤器。
爱新觉罗载湉2.1.
3. OAuth2TokenEndpointFilter
处理不同 Grant Type,并真正颁发 Token(AccessToken 和 RefreshToken)的过滤器。这个过滤器是颁发的核⼼,并且处理的事情⽐较复杂,在后⾯从流程介绍时再进⼀步说明。
2.1.4. OAuth2TokenIntrospectionEndpointFilter
授权服务器会颁发 Token,同时,也负责要验证颁发出的 Token 的有效性。此过滤器被调⽤⽤于确认 Token 的有效性,Token 有效则返回属于这个 Token 的⼀些认证授权信息。
{{AuthorizationServer}}/oauth2/introspect?token={{AccessTokenUUID}}
2.1.5. OAuth2TokenRevocationEndpointFilter
负责 Token 的注销
{{AuthorizationServer}}/oauth2/revoke?token={{AccessTokenUUID}}
2.2. 资源服务器 SecurityFilterChain 过滤链
除授权服务器拦截的 url 外,其他任意请求都进资源服务器配置类的过滤器链。注意,任意请求的意思,也就是所有请求都要经过这⾥进⾏安全的鉴权和控制。这就是在 OAuth2 ⽅案下进⾏鉴权的关键过滤器链了。
这个过滤器链,与传统(单体)应⽤下的过滤器链中的过滤器类(数量顺序)基本上是⼀致的。除了在资源服务器下新增
的 BearerTokenAuthenticationFilter 过滤器。
2.2.1. BearerTokenAuthenticationFilter
在资源服务器的⾓度下,任何请求都需要验证该请求的有效性。请求中必须要附上 Token,那 Token 会经过此过滤器,调⽤认证管理器AuthenticationManager 来对此 Token 进⾏校验(⼀般校验流程与上述授权服务器的 OAuth2TokenIntrospectionEndpointFilter ⼀致)。
成功后,则把校验成功的信息存储在 SecurityContext 中,然后转到下⼀步的过滤器进⾏鉴权。
3. 授权模式
对不同授权许可类型进⾏分析与流程的梳理、记录,并整理对此进⾏扩展补充的地⽅。
3.1. 客户端凭据许可
客户端凭据许可:grant_type=client_credentials。
下⾯会介绍⼀下客户端凭据许可的使⽤场景。在解释的案例中,⼩兔软件代指⼀个软件应⽤。
客户端凭据许可主要使⽤在访问的资源,没有明确的资源拥有者。换句话说就是,如果⼩兔软件访问了⼀个不需要⽤户⼩明授权的数据,⽐如获取京东 LOGO 的图⽚地址,这个 LOGO 信息不属于任何
⼀个第三⽅⽤户,再⽐如其它类型的第三⽅软件来访问平台提供的省份信息,省份信息也不属于任何⼀个第三⽅⽤户。
此时,在授权流程中,就不再需要资源拥有者这个⾓⾊了。当然了,你也可以形象地理解为 “资源拥有者被塞进了第三⽅软件中” 或者“第三⽅软件就是资源拥有者”。这种场景下的授权,便是客户端凭据许可,第三⽅软件可以直接使⽤注册时的 app_id 和 app_cret 来换回访问令牌 token 的值。
还是以⼩明使⽤⼩兔软件为例,来看下客户端凭据许可的整个授权流程,如下图所⽰:
这⾥,图⽰的app_id和app_cret等同于client_id和client_cret。
3.1.1. 获取访问 token
夏侯渊和夏侯惇3.1.1.1. 请求响应说明
请求格式
名称说明
url/oauth2/token
Method POST
Content-Type application/x-www-form-urlencoded
Authorization格式为:Basic 。 为 ba64 编码的 {client_id}:{client_cret}。
请求参数
名称说明
仁者爱人下一句
grant_type授权许可类型。 固定为 client_credentials(客户端凭据许可)
scope可选。申请的权限范围
响应
名称说明
access_token访问 token,格式为 uuid
scope申请并获得授权的 scope
token_type token 的类型。固定值 Bearer
expires_in访问 token 有效期,单位为秒
突然的自我
客户端凭据许可中,根据 OAuth2 规范,不会返回 refresh_token 。因此,如果 token 过期,则重新发起申请获取⼀次就可以了。
3.1.1.2. postman 测试结果