【问题标题】:How can I verify the signature of a id_token coming from Azure AD B2C如何验证来自 Azure AD B2C 的 id_token 的签名
【发布时间】:2020-08-12 21:03:23
【问题描述】:

我在 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

【问题讨论】:

  • 该 URL 似乎是一个密钥库(看不到,因为您 'xxx'ed 了 id)。通常,您需要一个发布公钥的 URL(您可能已经得到了)。从那里读取 JWKS 并找到 ID(孩子)与令牌标题中的孩子相同的密钥。类似于this

标签: jwt azure-ad-b2c


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    据我所知,没有办法判断JWT是否合法,但是解码非法JWT时会抛出异常,所以可以通过捕获异常来判断是否合法。

    解码 JWT:

    公共字符串 parseToken(String jwt) {

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

    验证 JWT:

    public boolean isTokenValid(String jwt) {

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

    【讨论】:

    • 这个答案是正确的,但不完全是我所追求的。我实际上很困惑,因为我找不到关键 URL。但经过更多研究后,我发现了它。
    猜你喜欢
    • 2019-08-28
    • 2017-09-02
    • 2018-04-29
    • 2017-06-20
    • 2017-08-25
    • 1970-01-01
    • 2019-06-25
    • 2017-03-31
    • 2018-12-25
    相关资源
    最近更新 更多