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

Azure签发JWT的签名验证失败问题求助

问题根源分析

以下是导致Microsoft Entra签发的JWT签名验证失败的常见原因:

  • kid不匹配:Azure会定期轮换签名密钥,必须使用JWT头部中的kid字段,从JWK集中匹配对应的公钥,不能随机选取或使用旧密钥。
  • 签名算法指定错误:Microsoft Entra v2令牌默认使用RS256算法,验证时必须明确指定该算法,若误用HS256等对称算法会直接验证失败。
  • 令牌来源不匹配:需验证JWT的iss声明,确保其值为https://login.microsoftonline.com/573ae0ae-0a5d-4098-8813-0f140a1c85da/v2.0,避免使用其他租户或环境的令牌。
  • 令牌生命周期问题:未验证exp(过期时间)和nbf(生效时间)声明,使用了已过期或未生效的令牌。
  • JWK格式处理错误:部分库需要将JWK转换为PEM格式才能使用,若转换逻辑有误(如遗漏参数、格式错误)会导致验证失败。
PHP代码示例(使用firebase/php-jwt)

以下是完整的JWT签名验证流程,包含JWK获取、匹配及验证步骤:

<?php
require 'vendor/autoload.php';

use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Firebase\JWT\JWK;

// 待验证的JWT令牌
$jwt = 'YOUR_MICROSOFT_JWT_TOKEN';

// 租户JWK集地址
$jwksUrl = 'https://login.microsoftonline.com/573ae0ae-0a5d-4098-8813-0f140a1c85da/discovery/v2.0/keys';

// 获取JWK集
$jwks = json_decode(file_get_contents($jwksUrl), true);

try {
    // 解析JWT头部,获取kid
    $header = JWT::decode($jwt, new Key('', 'none'), ['verify_signature' => false])->header;
    $kid = $header->kid;

    // 匹配对应的JWK
    $matchedKey = null;
    foreach ($jwks['keys'] as $key) {
        if ($key['kid'] === $kid) {
            $matchedKey = $key;
            break;
        }
    }
    if (!$matchedKey) {
        throw new Exception("No matching key found for kid: $kid");
    }
    $key = JWK::parseKey($matchedKey);

    // 验证JWT签名及声明
    $decoded = JWT::decode(
        $jwt,
        $key,
        ['RS256'],
        [
            'iss' => 'https://login.microsoftonline.com/573ae0ae-0a5d-4098-8813-0f140a1c85da/v2.0',
            // 可根据需求添加aud(受众)等其他必填声明验证
        ]
    );

    echo "JWT验证成功!";
    var_dump($decoded);
} catch (Exception $e) {
    echo "验证失败:" . $e->getMessage();
}
?>
额外排查建议
  1. 先在jwt.io上手动验证:将JWT粘贴进去,从JWK集中找到与令牌kid匹配的公钥(转换为PEM格式),粘贴到"Public Key"栏,确保算法选择RS256,查看是否能通过验证。
  2. 检查令牌是否完整:确保JWT包含头部、载荷、签名三部分,且没有被截断或修改。
  3. 确认网络环境:确保服务器能正常访问Azure的JWK集地址,没有被防火墙或代理拦截。

内容的提问来源于stack exchange,提问作者apache_borys

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:06:08