NextAuth集成Azure AD B2C登录报错:预期200 OK,实际返回404 Not Found
背景
开发Next.js项目,使用NextAuth集成Google和Azure AD B2C OAuth认证,Google认证流程正常,但Azure AD B2C登录时触发404 Not Found错误,错误堆栈指向OAuth流程中的Issuer.discover方法调用失败。已确认Azure应用注册的重定向URL、租户ID、客户端ID/密钥均配置正确。
可能的解决思路
1. 修正tenantId的配置格式
Azure AD B2C的tenantId需要填写完整租户域名(例如your-tenant-name.onmicrosoft.com),而非仅租户短名称(如your-tenant-name)。NextAuth的AzureADB2CProvider会基于tenantId自动拼接发现端点URL,使用短名称会导致URL构造错误,最终返回404。
修正示例:
AzureADB2CProvider({ tenantId: process.env.AZURE_AD_B2C_TENANT_NAME ?? "", // 确保值为xxx.onmicrosoft.com格式 // ...其他配置项 })
2. 必须指定Azure AD B2C用户流/策略
Azure AD B2C的OAuth端点与用户流(Policy)强绑定,默认配置未指定策略时,NextAuth无法正确识别端点地址。需在Provider配置中添加policy字段,值为你的用户流名称(例如B2C_1_signupsignin1):
AzureADB2CProvider({ tenantId: process.env.AZURE_AD_B2C_TENANT_NAME ?? "", clientId: process.env.AZURE_AD_B2C_CLIENT_ID ?? "", clientSecret: process.env.AZURE_AD_B2C_CLIENT_SECRET ?? "", policy: "B2C_1_signupsignin1", // 替换为你的用户流名称 authorization: { params: { scope: "offline_access openid", }, }, // ...其他配置项 })
若自动拼接端点仍有问题,可手动指定所有核心端点:
AzureADB2CProvider({ tenantId: process.env.AZURE_AD_B2C_TENANT_NAME ?? "", clientId: process.env.AZURE_AD_B2C_CLIENT_ID ?? "", clientSecret: process.env.AZURE_AD_B2C_CLIENT_SECRET ?? "", authorization: { url: `https://${process.env.AZURE_AD_B2C_TENANT_NAME}.b2clogin.com/${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/B2C_1_signupsignin1/oauth2/v2.0/authorize`, params: { scope: "offline_access openid" } }, token: `https://${process.env.AZURE_AD_B2C_TENANT_NAME}.b2clogin.com/${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/B2C_1_signupsignin1/oauth2/v2.0/token`, userinfo: `https://${process.env.AZURE_AD_B2C_TENANT_NAME}.b2clogin.com/${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/B2C_1_signupsignin1/openid/v2.0/userinfo`, issuer: `https://${process.env.AZURE_AD_B2C_TENANT_NAME}.b2clogin.com/${process.env.AZURE_AD_B2C_TENANT_NAME}.onmicrosoft.com/B2C_1_signupsignin1/v2.0/`, // ...其他配置项 })
3. 调整PKCE与客户端认证方式配置
当前配置中checks: ["pkce"]和client.token_endpoint_auth_method: "none"的组合可能存在冲突:
- 如果你的Azure应用是Web应用类型(机密客户端),Azure AD B2C默认要求使用
client_secret_basic认证方式,可尝试移除client.token_endpoint_auth_method: "none"配置,保留PKCE:
AzureADB2CProvider({ // ...其他配置项 checks: ["pkce"], // 移除 client.token_endpoint_auth_method: "none" })
- 如果你的应用是单页应用(SPA),则保持
token_endpoint_auth_method: "none",但需确认Azure应用注册的「认证」页面中已启用「允许公共客户端流」。
4. 验证环境变量的实际加载值
临时添加日志打印环境变量,确认AZURE_AD_B2C_TENANT_NAME、AZURE_AD_B2C_CLIENT_ID等参数是否正确加载,避免空值或拼写错误导致端点URL拼接失败:
// 在authOptions定义前添加 console.log("Azure Tenant ID:", process.env.AZURE_AD_B2C_TENANT_NAME); console.log("Azure Client ID:", process.env.AZURE_AD_B2C_CLIENT_ID);
内容的提问来源于stack exchange,提问作者nithin_sikinam

