自定义TokenEnhancer未将额外声明加入JWT负载,此行为是否正常?
正常来说,如果你通过TokenEnhancer给JWT添加额外声明,那testProperty应该同时出现在授权服务器返回的JSON响应里,以及JWT的Payload中。出现你说的这种“响应有、JWT里没有”的情况,大概率是你的配置或者TokenEnhancer的实现环节出了问题,我给你列几个常见的排查方向:
1. 你可能只修改了令牌响应,没真正注入JWT Payload
很多人会不小心把字段加到OAuth2令牌响应的额外信息区(比如OAuth2AccessToken.getAdditionalInformation()),但没让它进入JWT的Claims。比如在Spring Security OAuth2里,如果你只是在TokenEndpoint的响应里追加字段,而没把TokenEnhancer和JwtAccessTokenConverter绑定,那这个字段只会出现在返回的JSON里,不会被写入JWT。
2. TokenEnhancer的配置顺序或方式不对
拿Spring环境举例,你得确保TokenEnhancer被加入到TokenEnhancerChain里,并且和JwtAccessTokenConverter一起配置到授权服务器的端点中,顺序不能错:
@Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); // 先加自定义的TokenEnhancer,再加JwtAccessTokenConverter enhancerChain.setTokenEnhancers(Arrays.asList(yourCustomTokenEnhancer(), jwtAccessTokenConverter())); endpoints.tokenEnhancer(enhancerChain); // 其他必要配置... }
如果没这么做,你的自定义增强逻辑可能根本没参与到JWT的生成过程。
3. 自定义TokenEnhancer的实现有问题
检查你的TokenEnhancer实现类,是不是正确把字段加到了令牌的额外信息里?比如:
public class YourCustomTokenEnhancer implements TokenEnhancer { @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { Map<String, Object> extraClaims = new HashMap<>(); extraClaims.put("testProperty", "your-desired-value"); // 要把额外字段放到accessToken的additionalInformation里 ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(extraClaims); return accessToken; } }
另外,如果你用了JwtAccessTokenConverter,它默认会把additionalInformation里的所有字段都写入JWT Payload,除非你重写了它的convertAccessToken方法做了过滤,这也得排查。
最后总结
正常配置下,你添加的testProperty应该同时出现在响应JSON和JWT Payload里。你现在的情况明显是配置漏了环节,按照上面的几点去排查,重点确认你的TokenEnhancer是不是真的参与到了JWT的生成流程中,而不是仅仅修改了返回的JSON响应。
内容的提问来源于stack exchange,提问作者rinatcormier

