如何使用资源服务器使用的 keyUri 中的服务 ID 来获取 JWT 验证程序密钥?

How to use a service id in the keyUri used by a resources server to get the JWT verifier key?

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

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

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

如果我提供授权提供者的直接 url(使用 spring.oauth2.resource.jwt.keyUri),例如 http://ip_of_authorization_provider/oauth/token_key.

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

在我看来,问题出在 this file 的第 225 行的 JwtTokenServicesConfiguration 中,具体来说:

private RestTemplate keyUriRestTemplate = new RestTemplate();

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

有没有一种方法可以做我想做的事,而无需在我的应用程序中重新创建整个 ResourceServerTokenServicesConfiguration class 只是为了进行这个小修改?

有一个更简单、更干净的解决方案:

只需放弃由 spring-cloud-security 进行的自动配置,并提供您自己的 tokenServices 实现,该实现提供了一个 JwtAccessTokenConverter,您已通过 LoadBalanced RestTemplate 提供了其密钥。无论如何,您最终可能会想要在配置中提供其他细节...