spring-security-oauth2 - 将用户数据添加到 Spring Security OAUth2 的 JWT 有效负载

标签 spring-security-oauth2

我使用 JWT token 的 spring security OAuth2 一段时间了,但现在我需要向 JWT token 添加 2 个用户定义的值。

因此,当我向请求/oauth/token?grant_type=client_credentials&user_value=1234567890 添加一组附加参数时。

上面的 user_value 用于演示目的。我可以将其一路追踪到我的 CustomTokenEnhancer(我将其连接为一路传递此信息的方式)。所有请求参数都通过传递给我的 CustomTokenEnhancer 的 OAuth2Authentication 身份验证可见。

现在我可以将此信息添加到作为 token 请求的一部分返回给我的附加信息中。见下文。

{
   "access_token":"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsicGhpLWFwaSJdLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwib3JnYW5pemF0aW9uIjoicGhpLXVzZXJtZ3RuIiwidXNlcl90b2tlbiI6IjEyMzQ1Njc4OTAiLCJleHAiOjE0ODczNjc2NzEsImF1dGhvcml0aWVzIjpbIlJPTEVfQ0xJRU5UIl0sImp0aSI6IjFlZDMzZTAxLTc1ZGUtNDNjZC1hMzk2LTFkMzk2N2Y1NDQ5OCIsImNsaWVudF9pZCI6InBoaS11c2VyIn0.p628BNaaGljypEcGXZMkstNeTN-221qzzNQQ0npxDLTszWaXkgXqsBnBbKf9XMEtWTeCQkIszC9ne1Ei2X5IWTskhLT9Rko-8K7Jq-mXUc6HJZW-3tGV5rRer8Eyyw1wysW9Jiyp7sPkN-TIx12A70f_LHm6PrRR4ECppHWADs-2DvYA30p8omT1_RTt2WlqC40mopUN2TBPkb1WulVpOUEpcP358Ox8oVP8VQRSkLGZKB_b0KZAK9KGjLg6WNh8RghZaBuYuJQpITe_0XEBs_JfwrHhcK1IGaoYwSS7IGp3Cima9OMljdzayDKRqlfSl3WhaBuFmD1S37p-OVQL0A",
   "token_type":"bearer",
   "expires_in":8967,
   "scope":"read write",
   "user_value":"1234567890",
   "jti":"1ed33e01-75de-43cd-a396-1d3967f54498"
}

但我不希望这些值以这种方式可见。我希望将它们添加到加密 token 中。

我花了一些时间寻找,但不清楚我实际上是如何添加它的。这应该是可能的,不是吗?

最佳答案

在你自己的 TokenEnhancer 中,你必须再次对其进行编码:

@Override
public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    // Generate additional Information [...]


    // Write it to the token
    ((DefaultOAuth2AccessToken)accessToken).setAdditionalInformation(addInfo);

    // Encode Token to JWT
    String encoded = super.encode(accessToken, authentication);

    // Set JWT as value of the token
    ((DefaultOAuth2AccessToken) accessToken).setValue(encoded);

    return accessToken;
}

您可以使用 JwtHelper 方法解决此问题,但我只是扩展了 JwtAccessTokenConverter,因此我可以只使用编码和解码。

实例化您的Token增强器时,您必须添加 keystore 信息:

private CustomTokenEnhancer jwtCustomEnhancer() {
    KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(new ClassPathResource("jwt.jks"), "***".toCharArray());
    CustomTokenEnhancer converter = new CustomTokenEnhancer();
    converter.setKeyPair(keyStoreKeyFactory.getKeyPair("jwt"));

    return converter;
}

关于spring-security-oauth2 - 将用户数据添加到 Spring Security OAUth2 的 JWT 有效负载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42307016/

相关文章:

spring-boot - Spring Cloud Gateway 和 TokenRelay 过滤器

spring - 身份验证在 Spring Boot 1.5.2 和 Oauth2 中不起作用

spring-security - 使用正确的访问 token 访问 OAuth2 secret 资源时遇到问题

java - Spring Boot 。无法使用 token 进行身份验证

spring-security - 如何使用带有 WebClient 的 spring-security-oauth2 自定义 OAuth2 token 请求的 Authorization header ?

spring-boot - Outh2.0 access_tokens 会被泄露吗?

java - 使用额外回调处理自定义登录

java - Oauth 2.0 - 单个资源服务器但多个客户端应用程序

java - Spring 安全5 : There is no PasswordEncoder mapped for the id "null"

java - 使用 JHipster、Spring Security 和 oauth2 控制身份验证重定向