使用JWKs端点处理JWT令牌

使用JWKs端点处理JWT令牌,jwt,jose4j,Jwt,Jose4j,我收到两个jwt:一个OpenID连接令牌(id\u令牌)和一个访问令牌(Access\u令牌)。OpenID的情况或多或少是清楚的-我可以使用JWKs端点对其进行验证: 如示例()所示: 问题是如何继续使用访问令牌。我可以从中提取userId和userDetails,但我想我还需要验证它 如果我尝试使用与令牌相同的方法,则会出现错误:unsolvableKeyException:无法为JWS找到合适的验证密钥,其中包含头{“alg”:“RS256”,“kid”:“1”}。事实上,“kid”没有

我收到两个jwt:一个OpenID连接令牌(id\u令牌)和一个访问令牌(Access\u令牌)。OpenID的情况或多或少是清楚的-我可以使用JWKs端点对其进行验证:

如示例()所示:

问题是如何继续使用访问令牌。我可以从中提取userId和userDetails,但我想我还需要验证它

如果我尝试使用与令牌相同的方法,则会出现错误:
unsolvableKeyException:无法为JWS找到合适的验证密钥,其中包含头{“alg”:“RS256”,“kid”:“1”}
。事实上,“kid”没有键:“1”,这个值“1”似乎有点奇怪


我做错了什么吗?

听起来你在扮演OpenID连接客户端或依赖方的角色。这两个令牌,ID令牌和access令牌,用于不同的目的,应该由客户端进行不同的处理。ID令牌用于客户端,并支持在客户端对最终用户进行身份验证。在允许最终用户进入之前,客户端必须验证ID令牌(验证签名并验证exp和aud等声明)。然而,访问令牌是供客户端用来访问资源或API的,而不是直接供客户端使用或验证。访问令牌对客户端是不透明的,客户端不应该关心或知道它的详细信息。事实上,访问令牌并不总是JWT。在OpenID Connect中,访问令牌用于调用用户信息端点(使用HTTP头,
Authorization:Bearer[access token]
),以获取有关最终用户的更多声明/信息


孩子的“1”值是完全合法的,但它指的是AS/OP和用户信息端点不知何故知道的密钥。它不是OpenID Connect JWKS端点处的密钥。“1”不是客户端需要知道的密钥,因为客户端不应该直接验证访问令牌

这本书的内容是什么?smth.com无法为我解析。完整的异常消息还应显示来自JWKS终结点的内容。在没有看到JWKS的情况下,我无法确切说明发生了什么,但基本上发生的是JWT是用RSA签名的,并且包含了一个值为“1”的密钥id头,它应该指向JWKS中的相应验证密钥(可视示例)。在JWKS端点处似乎没有kid=1的RSA密钥。感谢您的回复,我更改了问题。是的,kid=1没有密钥,而且值“1”与OpenID相比似乎很奇怪,在OpenID中,我得到了一些真实的kid,比如“dp1kr”,它会随着时间而变化。如果您面临这种身份验证,可以给我一个提示-这两个令牌是否应该以相同的方式进行?我希望看到一些确认(一些指向nice文档的链接,例如)。我找不到关于这种精确身份验证的任何信息——我的意思是使用了太多的JWT令牌:OpenId和AccessToken。请看中的第2.2节、第2.3节等(这是一个简化的配置文件,但应该传达了这个想法)。是的,我或多或少读过这篇文章。但我仍然感到困惑的是,我收到的AccessToken是xxx.yyy.zzz,并且根本不使用zzz。那么它为什么会存在呢?访问令牌,可以有不同的结构和格式。客户端不应该知道或关心访问令牌的结构——它只需要知道如何使用它。在某些情况下(如您所见),JWT/JWS用于访问令牌。这是为了保护它不被修改,但是RS(userinfo端点或其他受保护的资源)需要验证签名,而不是客户端。好的,我认为这对于这个问题来说太过分了。我可能需要正确地命名它并重新格式化。
HttpsJwks httpsJkws = new HttpsJwks("https://smth.com/JWKS");
HttpsJwksVerificationKeyResolver httpsJwksKeyResolver = new HttpsJwksVerificationKeyResolver(httpsJkws);
jwtConsumer = new JwtConsumerBuilder()
    .setVerificationKeyResolver(httpsJwksKeyResolver)
    .setExpectedAudience(...)
    .setExpectedIssuer(...)
    .build();