【问题标题】:How to add content to an Spring oauth2 access token?如何将内容添加到 Spring oauth2 访问令牌?
【发布时间】:2017-05-15 00:30:56
【问题描述】:

如果我正确理解了 oauth2 规范,我应该能够将自定义内容(如 user_id)添加到 oauth2 访问令牌中。然后,服务器可以解码访问令牌并将用户域对象添加到 SecurityContextHolder。

(当然我可以将 user_id 添加到每个 REST API 方法中,但这意味着需要大量重构)

现在通过阅读手册,我认为我需要实现或扩展 TokenEnhancer。因为我可能使用的是 javascript 客户端 我应该扩展 JwtAccessTokenConverter 吗?我走在正确的道路上吗?

【问题讨论】:

    标签: spring spring-security oauth-2.0 spring-security-oauth2


    【解决方案1】:

    首先为什么您需要将 userId 广告到 Access 令牌,而您可以将数据存储在 Scope 或附加信息中,让我描述一下使用范围:

    如果您的客户端需要使用访问令牌获取特定数据,您可以将其作为范围参数发送到 Auth 服务器,然后当将访问令牌重定向到重定向 URL 时,您将获得放入范围参数的数据,这用于存储统计信息您的用户在身份验证之前和之后。

    如果您希望此用户 ID 用于其他用途而不是存储状态,我建议在 Auth 服务器上创建端点以提供用户详细信息并使用带有访问令牌的 OAuth 保护它。

    我不建议在生成访问令牌时放置任何数据,因为它可能会削弱令牌的复杂性,也不建议在客户端解码您的令牌。

    【讨论】:

    • 感谢您的回答。我的想法是服务器(端点)解码访问令牌并在 user_id 的帮助下将用户添加到 SecurityContextHolder
    • 检查Access Token表的sql,它已经包含user_name,所以你可以直接从DB获取它,无需解码。如果您的端点无权访问此数据库,您可以在身份验证服务器上执行端点,根据访问令牌公开用户配置文件,并且此请求也由 OAuth 保护。
    【解决方案2】:
    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new TokenEnhancer() {
            @Override
            public OAuth2AccessToken enhance(OAuth2AccessToken oAuth2AccessToken, OAuth2Authentication oAuth2Authentication) {
                DefaultOAuth2AccessToken newToken = new DefaultOAuth2AccessToken(oAuth2AccessToken);
                Map<String, Object> addInfo = new HashMap<>();
                // add here what u need
                addInfo.put("putName", oAuth2Authentication.getName());
                newToken.setAdditionalInformation(addInfo);
                return newToken;
            }
        };
    }
    

    在 AuthorizationServerConfiguration:

    @Autowired
    private TokenEnhancer tokenEnhancer;
    ...
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints)
            throws Exception {
        endpoints
                .tokenStore(this.tokenStore)
                .authenticationManager(this.authenticationManager)
                .userDetailsService(this.userDetailsService)
                .tokenEnhancer(this.tokenEnhancer);
    }
    

    【讨论】:

    • 如果您在答案中添加一个小解释,以便我们了解您在做什么,那就太好了。
    猜你喜欢
    • 2017-04-06
    • 2016-01-04
    • 1970-01-01
    • 2015-04-12
    • 2019-11-07
    • 2018-12-01
    • 2019-03-13
    • 2018-05-03
    • 1970-01-01
    相关资源
    最近更新 更多