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

NextAuth集成Azure AD B2C登录报错:预期200 OK,实际返回404 Not Found

问题:NextAuth集成Azure AD B2C时出现404 Not Found(Issuer.discover失败)

背景

开发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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 19:32:16