10

我收到两个 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:无法为带有标头 {"alg" : "RS256", "kid":"1"} 的 JWS 找到合适的验证密钥

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

我做错了什么吗?

4

1 回答 1

5

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

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

于 2015-08-31T13:08:31.633 回答