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

Node.js中使用passport-azure-ad验证Azure令牌签发者失败排查

Azure令牌签发者验证失败问题解决方案

问题描述

Node.js API使用passport-azure-ad的BearerStrategy验证Angular应用通过MSAL获取的Azure令牌时,将validateIssuer设为true会触发错误authentication failed due to: jwt issuer is invalid,接口返回未授权;但设为false时验证正常。

核心原因

  1. v2.0端点的Issuer格式差异:Azure AD v2.0端点的签发者(issuer)格式为https://login.microsoftonline.com/{tenantId}/v2.0,当前配置中使用的sts.windows.net是v1.0端点的域名,导致元数据获取的签发者与令牌实际签发者不匹配。
  2. Issuer参数未正确配置:配置中issuer设为null,当validateIssuer为true时,passport-azure-ad无法正确匹配令牌的签发者。

解决步骤

1. 确认令牌的实际Issuer值

将Angular应用获取的令牌复制到jwt.io(本地解析,无需上传),查看iss字段的值,格式应为:

https://login.microsoftonline.com/{你的租户ID}/v2.0

2. 修正配置文件中的元数据域名

修改azure.conf.json的metadata.authority为v2.0端点的域名:

{
    "metadata": {
      "authority": "login.microsoftonline.com", // 替换原sts.windows.net
      "discovery": ".well-known/openid-configuration",
      "version": "v2.0"
    },
    // 其他配置保持不变
}

3. 正确设置Issuer参数

根据你的租户类型选择配置方式:

  • 单租户场景:直接指定令牌的Issuer值到配置中:
    {
        "credentials": {
          // 其他凭证配置
          "issuer": "https://login.microsoftonline.com/{你的租户ID}/v2.0"
        }
    }
    
    然后在authRouter.js的options中引用该值:
    const options = {
        // 其他配置
        issuer: azureConfig.credentials.issuer, // 替换原null
        validateIssuer: azureConfig.settings.validateIssuer,
        // 其他配置
    };
    
  • 多租户场景:如果API需要支持多个租户,将issuer设为数组,包含所有允许的签发者:
    const options = {
        // 其他配置
        issuer: [
            "https://login.microsoftonline.com/租户ID1/v2.0",
            "https://login.microsoftonline.com/租户ID2/v2.0"
        ],
        validateIssuer: true,
        // 其他配置
    };
    

4. 验证Audience配置正确性

确保azure.conf.json中的audience与令牌的aud字段完全一致,通常是API应用的clientID或api://{clientID}格式。

5. 可选:检查passport-azure-ad版本

确保使用最新版本的passport-azure-ad,避免旧版本对v2.0端点的兼容问题:

npm update passport-azure-ad

修改后的示例代码片段

authRouter.js关键配置

const options = {
    identityMetadata: `https://${azureConfig.metadata.authority}/${azureConfig.credentials.tenantID}/${azureConfig.metadata.version}/${azureConfig.metadata.discovery}`,
    issuer: azureConfig.credentials.issuer, // 从配置读取正确的Issuer
    validateIssuer: azureConfig.settings.validateIssuer,
    clientID: azureConfig.credentials.clientID,
    audience: azureConfig.credentials.audience,
    // 其他配置保持不变
};

azure.conf.json完整示例

{
    "credentials": {
      "tenantID": "你的租户ID",
      "clientID": "Node.js应用的ClientID",
      "audience": "api://Node.js应用的ClientID",
      "issuer": "https://login.microsoftonline.com/你的租户ID/v2.0"
    },
    "resource": {
      "scope": ["general"]
    },
    "metadata": {
      "authority": "login.microsoftonline.com",
      "discovery": ".well-known/openid-configuration",
      "version": "v2.0"
    },
    "settings": {
      "validateIssuer": true,
      "passReqToCallback": false,
      "loggingLevel": "info"
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:12:48