Spring Oauth2-Authorization-Server Opaque认证

公冶麒
2023-12-01

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
 类似资料: