You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中验证带openid scope的Azure AD JWT Token失败排查

修复Azure AD JWT签名验证异常的方案

你的代码出现签名验证失败的核心原因是Azure AD端点版本不匹配:结合你提供的token声明信息(issuer为sts.windows.net/XXXXXXXX/),说明移动端获取的是V1版本的ID Token,但你的代码用了V2版本的配置,导致JWKS公钥和issuer验证不匹配。以下是具体修复步骤:

1. 修正JWKS公钥端点地址

V1版本Azure AD的公钥发现端点不需要v2.0路径,改为:

String jwkSetUri = "https://login.microsoftonline.com/" + tenant_id + "/discovery/keys";

2. 修正Issuer验证规则

token中的iss声明格式为sts.windows.net/{tenant_id}/,代码里的withIssuer要对应改成该格式,注意保留末尾的斜杠:

.withIssuer("https://sts.windows.net/" + tenant_id + "/")

3. 补充必要的安全验证项

为避免非法token请求,必须验证token的受众(aud,即你的应用ID):

.withAudience("XXXXXXXXXXXXXX") // 替换为你提供的audience字段内容

修复后的完整代码

try {
    String token = "your-token-here"; // 替换为真实token
    String tenant_id = "your-tenant_id"; // 替换为真实租户ID
    String audience = "XXXXXXXXXXXXXX"; // 替换为你的audience值

    // 修正V1版本的JWKS端点
    String jwkSetUri = "https://login.microsoftonline.com/" + tenant_id + "/discovery/keys";
    DecodedJWT decodedJWT = JWT.decode(token);
    JwkProvider jwkProvider = new UrlJwkProvider(new URL(jwkSetUri));

    Jwk jwk = jwkProvider.get(decodedJWT.getKeyId());
    Algorithm algorithm = Algorithm.RSA256((RSAPublicKey) jwk.getPublicKey(), null);
    
    JWTVerifier verifier = JWT.require(algorithm)
            // 修正为V1版本的issuer格式
            .withIssuer("https://sts.windows.net/" + tenant_id + "/")
            // 增加audience验证
            .withAudience(audience)
            .build();
            
    DecodedJWT verifiedJWT = verifier.verify(token);
    System.out.println("Jwt is valid: " + verifiedJWT);
} catch (MalformedURLException e) {
    throw new RuntimeException(e);
} catch (InvalidPublicKeyException e) {
    throw new RuntimeException(e);
} catch (JwkException e) {
    throw new RuntimeException(e);
}

额外注意事项

  • 确认移动端传递的是ID Token:隐式流可同时获取ID Token和Access Token,后端需验证包含openid scope的ID Token。
  • 签名算法匹配:Azure AD V1版本ID Token默认使用RS256签名,代码中Algorithm.RSA256的配置是正确的。

内容的提问来源于stack exchange,提问作者Burak Dağlı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:25:28