oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息

Posted

技术标签:

【中文标题】oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息【英文标题】:oAuth2 Springboot - add and return more informations in JDBCTokenStore 【发布时间】:2021-07-17 16:45:30 【问题描述】:

我想知道,是否有办法在 JDBCTokenStore 中添加更多信息。让我解释一下,目前,我正在使用 oauth2 身份验证通过 JDBCTokenStore 保护我的 Spring Boot REST API。

这是我正在使用的 AuthorizationServerConfiguration 类:

@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfiguration implements AuthorizationServerConfigurer 

    @Autowired
    private PasswordEncoder passwordEncoder;
    
    @Autowired
    private DataSource dataSource;
    
    @Autowired
    private AuthenticationManager authenticationManager;


    @Bean
    TokenStore jdbcTokenStore() 
        return new JdbcTokenStore(dataSource);
    

    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception 
        security.checkTokenAccess("isAuthenticated()").tokenKeyAccess("isAuthenticated()");

    

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception 
        clients.jdbc(dataSource).passwordEncoder(passwordEncoder);

    

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception 
        endpoints.tokenStore(jdbcTokenStore());
        endpoints.authenticationManager(authenticationManager);
    
    
    @Bean
    public FilterRegistrationBean<CorsFilter> corsFilter() 
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        FilterRegistrationBean<CorsFilter> bean = new FilterRegistrationBean<CorsFilter>(new CorsFilter(source));
        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
        return bean;
    

当我通过 POSTMAN 访问 POST 方法 URL 以获取 OAUTH2 令牌 http://localhost:8082/oauth/token 时,我得到了这个 json 响应:


    "access_token": "e71b98dd-8a53-44f4-9673-fa4c1c54a415",
    "token_type": "bearer",
    "refresh_token": "ac4e82ec-028a-45a6-8801-fe55fcbdd36e",
    "expires_in": 3042,
    "scope": "READ WRITE"

是否有解决方案可以在我的 Json JDBCTokenStore 中添加有关用户的更多信息(如电子邮件、性别...等)? 显然,TokenEnhancerChain 或 JWT 是我的问题的解决方案,除了我无法在不进行太多修改的情况下将它们集成到我的代码中。

提前谢谢你

【问题讨论】:

【参考方案1】:

在我看来,您将 OIDC 用户信息存储到数据库中,就像在您的代码中一样,

    @Bean
    TokenStore jdbcTokenStore() 
        return new JdbcTokenStore(dataSource);
    

您将 dataSource 作为参数传递。因此 Spring 框架将所有 OIDC 用户信息保存到您在此处配置的 dataSource 中。

无论您是使用 JWT 还是会话 ID 来验证和授权请求都无关紧要。关键是您正在使用的OidcUser


.getClaims()

org.springframework.security.oauth2.core.oidc.user Interface OidcUser OIDC 用户界面中,有一个名为java.util.Map&lt;java.lang.String,java.lang.Object&gt; getClaims() 的方法。这是您调用以获取自定义用户信息的方法,例如"address": "xxx", "totalApiUsage": 123

// ...
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication.getPrincipal() instanceof OidcUser) 
    OidcUser principal = ((OidcUser) authentication.getPrincipal());
    
    // principal.getClaims()

.claim()

发出访问令牌或刷新令牌后,调用.claim("xxx",object) 将自定义键值对放入您的OIDC 用户信息映射中,例如"address": "xxx", "totalApiUsage": 123

另见https://developer.okta.com/blog/2017/07/25/oidc-primer-part-1


除了你的问题,你提到了

目前,我正在使用 oauth2 身份验证通过 JDBCTokenStore 保护我的 Spring Boot REST API。

通过使用 Spring 安全框架从其他 OAuth2 授权服务器获取访问令牌,与现有的授权提供程序(如 Facebook、Auth0、Google 等)合作非常好。

但是,如果您想拥有自己的 OAuth2 授权服务器,您应该停止使用 Springboot 授权服务器,因为它目前处于维护模式。 另见EnableAuthorizationServer is working and is not deprecated

【讨论】:

以上是关于oAuth2 Springboot - 在 JDBCTokenStore 添加和返回更多信息的主要内容,如果未能解决你的问题,请参考以下文章

springboot整合oauth2

OAuth2用户详细信息未在春季安全(SpringBoot)中更新

springboot 集成oauth2

OAuth2-SpringBoot - 刷新令牌

SpringBoot 基于 OAuth2 统一身份认证流程详解

用户在springboot中调用注册休息API时如何获取oAuth2访问令牌?