如何在资源服务器使用的keyUri中使用服务标识来获取JWT验证者密钥?

时间:2015-09-22 15:52:37

标签: spring-boot spring-security-oauth2 spring-cloud

我有一个使用Spring云安全保护的OAuth资源服务器。

使用的OAuth令牌是JWT令牌,因此资源服务器需要验证者密钥才能检查令牌的签名。

为了简化配置,我希望资源服务器从授权提供程序获取验证程序密钥(也是一个带有@EnableAuthorizationServer的Spring引导服务)。

如果我提供授权提供程序的直接URL(使用spring.oauth2.resource.jwt.keyUri),例如http://ip_of_authorization_provider/oauth/token_key,这样可以正常工作。

问题是当我想在该值中提供service-id而不是IP或DNS时,例如。 http://authorization-provider/oauth/token_key

在我看来,问题出现在this file的第225行的JwtTokenServicesConfiguration中,特别是:

private RestTemplate keyUriRestTemplate = new RestTemplate();

如果keyUriRestTemplate是Autowired,我可以提供自己的负载平衡休息模板,或者如果在下面的jwtAccessTokenConverter方法中有@ConditionalOnMissingBean(JwtAccessTokenConverter.class),我也可以提供自己的负载均衡逻辑。

有没有办法做我想要的,没有在我的应用程序中重新创建整个ResourceServerTokenServicesConfiguration类的丑陋黑客只是为了只进行这个小修改?

1 个答案:

答案 0 :(得分:0)

有一个更简单,更清洁的解决方案:

抛弃spring-cloud-security所做的自动配置,并提供自己的tokenServices实现,这些实现提供了一个JwtAccessTokenConverter,它的密钥是你提供的LoadBalanced RestTemplate。您最终可能希望在配置中提供其他细节......