Jwt 如何验证来自Azure AD B2C的id_令牌的签名

Jwt 如何验证来自Azure AD B2C的id_令牌的签名,jwt,azure-ad-b2c,Jwt,Azure Ad B2c,我已经在Azure AD B2C中设置了一个用户流。产生的id_令牌是一个jwt。但是,我如何在API上验证需要受此JWT保护的JWT的签名呢 以下是JWT的一个示例: { "typ": "JWT", "alg": "RS256", "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk" } { "exp": 1587973546, "nbf": 1587969946, "ver": "1.0", "iss": "ht

我已经在Azure AD B2C中设置了一个用户流。产生的id_令牌是一个jwt。但是,我如何在API上验证需要受此JWT保护的JWT的签名呢

以下是JWT的一个示例:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}
{
  "exp": 1587973546,
  "nbf": 1587969946,
  "ver": "1.0",
  "iss": "https://appmanager2020.b2clogin.com/903e0c59-0e1d-4769-8a57-0caba1f56999/v2.0/",
  "sub": "f11eaa2e-0bad-400a-864f-57f9daa70999",
  "aud": "8ab24fa8-a5f2-4f7d-a1ad-31f21d7f999",
  "nonce": "123456",
  "iat": 1587969946,
  "auth_time": 1587969946,
  "idp": "https://sts.windows.net/903e0c59-0e1d-4769-8a57-0caba1f56999/",
  "oid": "f11eaa2e-0bad-400a-864f-57f9daa70999",
  "emails": [
    "some@email.com"
  ],
  "tfp": "B2C_1_some_employee_flow"
}
我不走运地尝试了这个URL:


据我所知,无法判断JWT是否合法,但在解码非法JWT时会抛出异常,因此您可以通过捕获异常来判断它是否合法

解码JWT:

公共字符串解析令牌(字符串jwt){

验证JWT:

公共布尔值无效(字符串jwt){


我们找到了公钥URL,从那里我们可以使用与上面类似的代码使其工作。

URL似乎是一个密钥库(看不见,因为您“xxx”了id)。通常您需要一个发布公钥的URL(您可能得到了该URL)。从那里阅读JWKS并找到id为的密钥(kid)与您令牌标题中的小孩相同。与此类似的答案是正确的,但不完全是我想要的。我实际上感到困惑,因为我找不到关键URL。但我在进一步研究后找到了它。
    return Jwts.parser()
            .setSigningKey(SECRET_KEY)
            .parseClaimsJws(jwt)
            .getBody()
            .getSubject();
}
    try {
        parseToken(jwt);
    } catch (Throwable e) {
        return false;
    }
    return true;
}