无法使用 nimbus 从 azure 验证访问令牌签名

Can't verify access token signature from azure using nimbus

在此之后 example 我编写了一些代码来通过来自 azure 的隐式流来验证访问令牌 return。

RemoteJWKSet remoteJWKSet = new RemoteJWKSet(new URL(jwksUri));
JWSKeySelector keySelector = new JWSVerificationKeySelector(JWSAlgorithm.RS256, remoteJWKSet);

ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor<>();

jwtProcessor.setJWTClaimsSetVerifier(new DefaultJWTClaimsVerifier(
      new JWTClaimsSet.Builder().issuer("https://sts.windows.net/3283e312-f73b-47d0-81c6-75e3ac726c21/").build(),
                new HashSet<>(Arrays.asList("sub", "iat", "exp", "scp"))));

jwtProcessor.setJWSKeySelector(keySelector);

JWTClaimsSet claimsSet = jwtProcessor.process(accessToken.getValue(), null);

但是验证失败,我得到:

com.nimbusds.jose.proc.BadJWSException: Signed JWT rejected: Invalid signature
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:378)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:303)
    at com.nimbusds.jwt.proc.DefaultJWTProcessor.process(DefaultJWTProcessor.java:294)

我想我不需要 DefaultJWTClaimsVerifier 部分,但删除它不会改变任何东西。我只是坚持这个例子。

你知道为什么会这样吗?

感谢您的帮助。

PS:无法用 jwt.io 验证。我粘贴了 access_token 和 jwk 的“键”部分的第一个条目。

您需要 expose an API scope 在 Azure 中,并让客户端使用它。还要确保访问令牌的 JWT header 中没有 nonce 字段。我的 blog post 有更多信息。

Azure 广告行为

上述行为是 Microsoft 特有的,并且在使用 Azure AD 作为提供程序时是必需的:

  • 在 JWT header 中带有 nonce 字段的令牌专为 MS API 设计,例如 Graph,并使用 in-house 验证机制。目的是让这些在自定义 APIs.

    中始终无法通过验证
  • 您自己的自定义 API 的令牌必须通过请求自定义范围的客户端检索。请注意,在 Azure AD 中配置的 OAuth 客户端可以是一个逻辑条目,而不需要为每个人维护一个 API.

我认为 MS 行为基于 OAuth resource indicators, though my personal preference is to use more mainstream techniques of scopes, claims 和观众在 API 秒内收到访问令牌时的检查。