【问题标题】:JWT signature's verification at resource-server side资源服务器端的 JWT 签名验证
【发布时间】:2015-12-05 00:09:13
【问题描述】:

根据thisthis有两种验证JWT令牌的方法:

  1. 使用RemoteTokenServices 基本上调用oauth 服务器的/check_token 端点,检索整个令牌并进行比较
  2. 在 oauth 服务器上公开公钥并在资源服务器上验证 JWT 的签名

一开始我尝试了第一种方法,但由于我使用自定义令牌转换器,每次生成令牌时都会访问数据库,我决定切换到资源端的签名验证 - 不想每次都获得额外的数据库调用每个客户的请求。

经过一番调查,我意识到ResourceServerTokenServices(接口描述令牌检索、转换和生成一个有效的OAuth2Authentication 对象)只有两个默认实现:DefaultTokenServices,主要用于 oauth 和资源服务器的情况与第一种方法中描述的RemoteTokenServices 相同的应用程序。

所以主要问题是spring-oauth2 是否真的没有默认的 JWT 签名验证实现,或者我只是找不到?

【问题讨论】:

  • 你找到解决方案了吗,我也在努力用 Spring Oauth JWT 令牌检查签名。
  • @dplesa 我做到了。实际上我使用了 Cristian Sevescu 的答案

标签: spring oauth-2.0 jwt spring-security-oauth2


【解决方案1】:

您不需要特定于 JWT 的 ResourceServerTokenServices,因此 DefaultTokenServices 应该可以。大多数具体实现细节都会发送到商店,所以只要您正确配置了JwtTokenStore,应该没有问题。

Here

资源服务器还需要能够解码令牌,因此 JwtTokenStore 依赖于 JwtAccessTokenConverter,并且授权服务器和资源服务器都需要相同的实现。令牌默认是签名的,资源服务器也必须能够验证签名,因此它要么需要与授权服务器相同的对称(签名)密钥(共享密钥,或对称密钥),要么需要公共与授权服务器中的私钥(签名密钥)匹配的密钥(验证者密钥)(公私密钥或非对称密钥)。公钥(如果可用)由授权服务器在 /oauth/token_key 端点上公开

您可以扩展 JwtAccessTokenConverter 以访问一次授权服务器以获取公开的公钥。

【讨论】:

  • DefaultTokenServices 假设 oauth 和资源服务器都可以访问相同的数据源。在我的情况下,双方都是独立的应用程序
  • 您认为 DefaultTokenServices 为什么会尝试访问任何数据源?它利用 tokenStore 来处理令牌。如果 tokenStore 是 JWTTokenStore,那么解码 token 应该没有问题。
  • 这不是解码令牌,它们没有加密))问题是:哪个spring的类可以做资源端JWT签名验证?
  • 我同意我可以使用JwtTokenStore,但在这种情况下,我必须在初始化时提供一个带有适当公钥/私钥的JwtAccessTokenConverter 实例,这是我不想这样做的......我想要即时获取公钥
  • 扩展JwtAccessTokenConverter并在运行时获取公钥。
猜你喜欢
  • 2016-09-13
  • 2016-06-09
  • 2018-10-13
  • 2019-01-18
  • 1970-01-01
  • 2016-08-28
  • 2019-11-14
  • 2020-05-22
相关资源
最近更新 更多