使用JWKs Endpoint处理JWT令牌

Pet*_*nov 10 jwt jose4j

我收到两个JWT:一个OpenID Connect令牌(id_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();
Run Code Online (Sandbox Code Playgroud)

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

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

我做错了吗?

Bri*_*ell 5

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

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