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时验证正常。
核心原因
- v2.0端点的Issuer格式差异:Azure AD v2.0端点的签发者(issuer)格式为
https://login.microsoftonline.com/{tenantId}/v2.0,当前配置中使用的sts.windows.net是v1.0端点的域名,导致元数据获取的签发者与令牌实际签发者不匹配。 - 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
相关产品推荐
相关产品推荐

