Spring Oauth2-Authorization-Server Opaque token 认证
基于 spring-security-oauth2-authorization-server 0.2.3
如果我们采用 opaque 方式进行token 认证,那我们会这样配置:
spring:
security:
oauth2:
resourceserver:
opaquetoken:
client-id: apple
client-secret: apple_secret
introspection-uri: http://localhost:9000/oauth2/introspect
对应的 resource-server 会是这样:
@Bean
SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.mvcMatcher("/messages/**")
.authorizeRequests()
.mvcMatchers("/messages/**").authenticated()
.and()
//采用 opaqueToken
.oauth2ResourceServer().opaqueToken();
return http.build();
}
Oauth2 认证流程
用户请求 resouece-server 过程
- user
- BearerTokenAuthenticationFilter: 解析 Authentication: Bearer {token} 中的token
- 交给 OpaqueTokenAuthenticationProvider
- OpaqueTokenAuthenticationProvider 委托 OpaqueTokenIntrospector 的 introspect 去校验 token
- OpaqueTokenIntrospector
- NimbusOpaqueTokenIntrospector: OpaqueTokenIntrospector的实现
- 添加 BasicAuthenticationInterceptor 拦截器
- 在认证之前,需要对该resource-server 的 client_id 和client_secret 进行认证
- 在Header 上添加 Authentication: Basic {Base64.encode(client_id:client_secret)}
- 在authentication-server 会被 OAuth2ClientAuthenticationFilter 拦截
- RestTemplate
- 通过 RestTemplate 去请求 authentication-server 的
/oauth2/introspect
- 在authentication-server 会被 OAuth2TokenIntrospectionEndpointFilter 拦截
authentication-server 认证过程:
- OAuth2ClientAuthenticationFilter
- OAuth2ClientAuthenticationFilter 的 ClientSecretBasicAuthenticationConverter 会检索出 Authentication 中 Basic 的token
- 委托 ClientSecretAuthenticationProvider 对 client_id 和 client_secret 进行认证
- 认证成功,交给下一个Filter
- OAuth2TokenIntrospectionEndpointFilter
- 拦截·
/oauth2/introspect
请求 - 委托 OAuth2TokenIntrospectionAuthenticationProvider 认证
- OAuth2TokenIntrospectionAuthenticationProvider
- 通过
OAuth2AuthorizationService
根据 token 到数据库查询 是否有 认证过的 OAuth2Authorization - 返回 OAuth2TokenIntrospectionAuthenticationToken