使用JWKs Endpoint处理JWT令牌

时间:2015-08-26 18:13:39

标签: jwt jose4j

我收到两个JWT:一个OpenID Connect令牌(id_token)和一个Access Token(access_token)。 OpenID的情况或多或少都很清楚 - 我可以使用JWKs Endpoint验证它: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,但我想我还需要验证它吗?

如果我尝试与令牌相同,我会收到错误:UnresolvableKeyException: Unable to find a suitable verification key for JWS w/ header {"alg" : "RS256", "kid":"1"}。事实上,“孩子”没有关键:“1”,这个值“1”似乎有点奇怪吗?

我做错了什么?

1 个答案:

答案 0 :(得分:5)

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

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