如何验证来自Azure AD B2C的id_token的签名

时间:2020-04-28 21:49:20

标签: jwt azure-ad-b2c

我已经在Azure AD B2C中设置了一个用户流。生成的id_token是jwt。但是,如何在需要受此JWT保护的API上验证该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时没有碰到运气:

https://login.microsoftonline.com/te/appmanager2020.onmicrosoft.com.onmicrosoft.com/b2c_1_xxx_employee_flow/discovery/v2.0/keys

2 个答案:

答案 0 :(得分:1)

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

解码JWT:

公共字符串parseToken(String jwt){

    return Jwts.parser()
            .setSigningKey(SECRET_KEY)
            .parseClaimsJws(jwt)
            .getBody()
            .getSubject();
}

验证JWT:

公共布尔isTokenValid(String jwt){

    try {
        parseToken(jwt);
    } catch (Throwable e) {
        return false;
    }
    return true;
}

答案 1 :(得分:0)

我们找到了公共密钥URL,从那里我们可以使用类似于上面的代码使它起作用。