0

连接到 Azure AD v2.0 端点我无法验证 jwt.io 和 jwt.ms 声明为有效的令牌

公共令牌没问题:

IDTokenValidator validator = new IDTokenValidator(issuer, clientId, JWSAlgorithm.RS256, jwkSetUrl);     
IDTokenClaimsSet validatedClaimsSet;
try {
    validatedClaimsSet = validator.validate(jwt, null);
} catch (BadJOSEException | JOSEException e) {
    LOGGER.error(e.getMessage());
    return;
}

但是验证来自机密客户端的令牌会引发异常

Signed JWT rejected: Another algorithm expected, or no matching key(s) found

使用以下代码

IDTokenValidator validator = new IDTokenValidator(issuer, clientId, JWSAlgorithm.RS256, new Secret(authMethod.getSecret()));

找不到匹配的键,因为 (JWKMatcher.java:1258)

  • 密钥类型不匹配:OCT 而不是 RSA
  • 使用为空
  • 操作为空

在此处输入图像描述

似乎从 ImmutableSecret.java:47 中的秘密创建了一个不充分的 JWKSet,但我似乎对秘密如何包含在 Azure 的 jwks_uri 中找到的必要数据缺乏了解

任何意见,将不胜感激

4

1 回答 1

0

对于公共客户端和机密客户端,验证 ID 令牌的工作方式相同。所以只要去掉 secret 参数,你的代码就可以工作了——使用令牌的签名公钥。

秘密参数适用于使用对称算法(例如 HMACSHA256)签名的 JWT——这几乎不是一个好主意。有关此主题的更多信息,请参阅 JWT 安全最佳实践

于 2022-02-13T12:25:46.890 回答