当我尝试使用spring-boot-starter-oauth2-resource-server
依赖项并将我的服务设置为oauth2 resource service
时,出现了一个问题。
我已经配置了spring oauth2 resource server
,但没有配置spring.security.oauth2.resourceserver.jwt.issuer-uri
和jwk-set-uri
属性。
相反,我已经指示spring oauth2 resource server
库如何解码JWT。
@Bean
public ReactiveJwtDecoder reactiveJwtDecoder() throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec("JAC1O17W1F3QB9E8B4B1MT6QKYOQB36V".getBytes(), mac.getAlgorithm());
return NimbusReactiveJwtDecoder.withSecretKey(secretKey)
.macAlgorithm(MacAlgorithm.HS256)
.build();
}
这样,我就可以验证jwt令牌了。
我心中升起的疑问是:
根据oauth rfc6749,“访问受保护资源”部分,指出:
客户端通过向资源服务器提供访问令牌来访问受保护的资源。资源服务器必须验证访问令牌,并确保它没有过期,并且其作用域覆盖所请求的资源。资源服务器验证访问令牌所使用的方法(以及任何错误响应)超出了本规范的范围,但**通常涉及资源服务器和授权服务器之间的交互或协调。spring oauth2 resource server
库是否工作正常?
1条答案
按热度按时间s5a0g9ez1#
这种方法没有错。这里可能的问题是您使用的是对称密钥。使用这种方法,您使用相同的密钥来签署令牌和验证其签名。这意味着您需要与身份验证过程中涉及的所有应用程序共享用于签署令牌的密钥,但这并不总是可能的,而且资源服务器的能力太强。
为了只在授权服务上保留密钥,资源服务器中有一个选项,可以使用授权服务公开的特殊端点来验证令牌。
另一种方法是使用非对称密钥对对令牌进行签名和验证。在这种情况下,私钥将仅分配给授权服务,而公钥可与身份验证过程中涉及的所有应用程序共享。