Spring 授权服务器自定义访问令牌响应以添加其他参数

问题描述 投票:0回答:4

我正在实现 spring 授权服务器,我想向令牌响应 json 添加一些自定义属性。以下是我想要的回应。

{
    "access_token": *jwt*,
    "scope": "articles.read openid",
    "token_type": "Bearer",
    "expires_in": 299,
    ***"customvalue1":99***
}

我在堆栈溢出中看到了多个帖子,其中讨论了类似的主题,但在这些场景中,附加数据被添加到 jwt 的声明或标头中。我的要求是将其添加到 jwt 之外。 我尝试实现 OAuth2TokenCustomizer,但这只允许修改 jwt 的声明或标头。有人可以帮忙吗?

spring spring-boot spring-security spring-security-oauth2
4个回答
2
投票

对于任何来这里寻找答案的人:

我最终覆盖了 OAuth2TokenEndpointFilter。它有一个身份验证成功处理程序,可以注入该处理程序以执行任何其他令牌响应操作。

   @Bean
    public Customizer<OAuth2TokenEndpointConfigurer> customizeTokenEndpoint() {
        return tokenEndpoint -> tokenEndpoint
                .accessTokenResponseHandler(success());
    }
      @Bean(name = "token")
    public AuthenticationSuccessHandler success() {
        return new TokenResponseSuccessHandler();
    }

然后在成功处理程序中,

@Override
       public void onAuthenticationSuccess(final HttpServletRequest request, final HttpServletResponse response, final Authentication authentication) throws IOException {
    final OAuth2AccessTokenAuthenticationToken accessTokenAuthentication = (OAuth2AccessTokenAuthenticationToken) authentication;
    ******
    ** 

       Map<String, Object> additionalParameters = accessTokenAuthentication.getAdditionalParameters();
                if(additionalParameters.size()==0)
                    additionalParameters=new HashMap<>();
             additionalParameters.put("hi","hi");

最后使用 OAuth2AccessTokenResponse.Builder 构建新的响应。


1
投票

如果您使用新的授权服务器,那么创建此 bean 将帮助您实现目标。好消息是,一旦检测到 Bean,它就会自动应用。

@Bean
    public OAuth2TokenCustomizer<JwtEncodingContext> tokenCustomizer() {
        return context -> {
            Authentication principal = context.getPrincipal();
            //context.getTokenType().getValue().equals("access_token")
            if (Objects.equals(context.getTokenType().getValue(), "access_token") && principal instanceof UsernamePasswordAuthenticationToken) {
                Set<String> authorities = principal.getAuthorities().stream()
                        .map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
                User user = (User) principal.getPrincipal();
                context.getClaims().claim("authorities", authorities)
                        .claim("user", user);
            }
        };
    }

重复如何使用 spring-authorization-server 在 JWT 中创建自定义声明


0
投票

您如何使用 OAuth2AccessTokenResponse.Builder 创建新答案?


-2
投票

这个类和方法也许对你有帮助。你可以找到类的初始化位置

© www.soinside.com 2019 - 2024. All rights reserved.