Spring JWT签名';s在资源服务器端的验证
根据和,有两种方法验证JWT令牌:Spring JWT签名';s在资源服务器端的验证,spring,oauth-2.0,jwt,spring-security-oauth2,Spring,Oauth 2.0,Jwt,Spring Security Oauth2,根据和,有两种方法验证JWT令牌: 使用基本上调用oauth服务器的/check\u token端点的RemoteTokenServices,检索整个令牌并对其进行比较 在oauth服务器上公开公钥,并在资源服务器上验证JWT的签名 开始时,我尝试了第一种方法,但由于我使用自定义令牌转换器,每次生成令牌时都会访问数据库,因此我决定切换到资源端的签名验证-不希望每个客户端请求都获得额外的数据库调用 经过一些调查,我意识到ResourceServerTokenServices(接口描述了令牌检索、转
/check\u token
端点的RemoteTokenServices
,检索整个令牌并对其进行比较经过一些调查,我意识到
ResourceServerTokenServices
(接口描述了令牌检索、转换和生成有效的OAuth2Authentication
对象)只有两种默认实现:DefaultTokenServices
,主要用于oauth和资源服务器是同一应用程序的一部分;以及第一种方法中描述的RemoteTokenServices
所以主要的问题是
spring-oauth2
是否真的没有JWT签名验证的默认实现,或者我只是找不到一个?您不需要特定于JWT的ResourceServerTokenServices
,所以DefaultTokenServices
应该可以。大多数特定于实现的详细信息都会发送到存储,因此只要正确配置了JwtTokenStore
,就不会出现问题
:
资源服务器还需要能够解码令牌,以便JwtTokenStore依赖于JwtAccessTokenConverter,授权服务器和资源服务器都需要相同的实现。默认情况下,令牌是经过签名的,并且资源服务器还必须能够验证签名,因此它要么需要与授权服务器相同的对称(签名)密钥(共享密钥或对称密钥),要么需要与授权服务器中的私钥(签名密钥)匹配的公钥(验证器密钥)(公钥-私钥或非对称密钥)。公钥(如果可用)由/oauth/token_key端点上的授权服务器公开
您可以扩展JwtAccessTokenConverter,以便在授权服务器访问公开公钥后进行访问。
DefaultTokenServices
假设oauth和资源服务器都可以访问相同的数据源。在我的情况下,双方都是分离的应用程序。您认为DefaultTokenServices为什么会尝试访问任何数据源使用tokenStore来处理令牌。如果tokenStore是JWTTokenStore,则解码令牌应该不会有问题。这与解码令牌无关,它们没有加密))问题是:哪个spring的类可以进行资源端JWT签名验证?我同意我可以使用JwtTokenStore
,但在这种情况下,我必须在初始化时提供一个JwtAccessTokenConverter
实例,并提供适当的公钥/私钥,这是我不想做的。。我想在flyExtendJwtAccessTokenConverter
上获取公钥,并在运行时获取公钥。您找到解决方案了吗?我也在努力用Spring Oauth JWT令牌检查签名。@dplesa我找到了。实际上我用了克里斯蒂安·塞维斯库的答案