使用 JWKs 端点处理 JWT 令牌

Process JWT token using JWKs Endpoint

我收到两个 JWT:一个 OpenID Connect ID 令牌 (id_token) 和一个访问令牌 (access_token)。 OpenID 的情况或多或少是清楚的——我可以使用 JWKS 端点对其进行验证:https://smth.com/JWKS.

如示例 (https://bitbucket.org/b_c/jose4j/wiki/JWT%20Examples):

HttpsJwks httpsJkws = new HttpsJwks("https://smth.com/JWKS");
HttpsJwksVerificationKeyResolver httpsJwksKeyResolver = new HttpsJwksVerificationKeyResolver(httpsJkws);
jwtConsumer = new JwtConsumerBuilder()
    .setVerificationKeyResolver(httpsJwksKeyResolver)
    .setExpectedAudience(...)
    .setExpectedIssuer(...)
    .build();

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

如果我尝试验证与 ID 令牌相同的访问令牌,我收到此错误:

UnresolvableKeyException: Unable to find a suitable verification key for JWS w/ header {"alg" : "RS256", "kid":"1"}

而且 "kid" : "1" 确实没有密钥,而且这个值 "1" 似乎有点奇怪?

我做错了什么吗?

听起来您正在实现 OpenID Connect 客户端或依赖方的角色。 ID 令牌和访问令牌这两个令牌有不同的用途,客户端应以不同方式处理。 ID 令牌用于客户端并在客户端启用 end-user 的身份验证。在允许 end-user 之前,客户端必须验证 ID 令牌(验证签名并验证 exp 和 aud 等声明)。访问令牌是供客户端用于访问资源或 API,但不直接供客户端使用或验证。访问令牌对客户端是不透明的,客户端不应该关心或知道它的详细信息。事实上,访问令牌并不总是 JWT。在 OpenID Connect 中,访问令牌用于调用用户信息端点(使用 HTTP header、Authorization: Bearer [access token])以获取有关 end-user 的更多 claims/info。

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