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

NextAuth集成AWS Cognito报nonce mismatch及OAuthCallback错误

问题修复方案

你遇到的api/auth/signin?error=OAuthCallback + 控制台nonce mismatch, expected undefined, got:报错,是NextAuth OAuth校验流程和Cognito Hosted UI返回参数不匹配导致的,Next.js 12.1.6 + NextAuth 4.5.0组合下按以下步骤排查即可解决:

1. 修正NextAuth配置

  • 不要在Cognito Provider配置里手动指定checks参数,4.5.0版本内置的Cognito Provider已经做了适配,手动加checks: ["nonce"]会强制要求nonce校验但预存逻辑不匹配,直接触发预期值为undefined的报错。
  • 基础配置参考如下,不要提前加自定义回调、nonce篡改逻辑,先跑通基础流程再做扩展:
// pages/api/auth/[...nextauth].js
import CognitoProvider from "next-auth/providers/cognito";

export default NextAuth({
  providers: [
    CognitoProvider({
      clientId: process.env.COGNITO_CLIENT_ID,
      // 只有Cognito客户端生成了secret才填这行,没生成secret直接删掉clientSecret字段,不要传空字符串
      clientSecret: process.env.COGNITO_CLIENT_SECRET,
      // issuer格式严格为 https://cognito-idp.<你的区域>.amazonaws.com/<你的用户池ID>,不要加/oauth2/authorize之类的后缀
      issuer: process.env.COGNITO_ISSUER,
    })
  ],
  // 部署在反向代理/Vercel等托管平台必须加这行,避免域名识别错误读不到校验cookie
  trustHost: true,
})
  • 确认环境变量NEXTAUTH_URL和你实际访问应用的域名完全一致,本地开发如果用http://localhost:3000访问就不要填http://127.0.0.1:3000,域名不匹配会导致NextAuth读不到之前存的nonce校验值。

2. 修正Cognito Hosted UI配置

  • 进入Cognito用户池-应用集成-对应应用客户端的主机UI设置页,授权类型只勾选code(授权码模式),不要勾选implicit隐式流,隐式流不会返回符合NextAuth校验规则的nonce参数,直接触发mismatch。
  • 回调URL必须严格和NextAuth的回调路径一致,格式为<你的应用域名>/api/auth/callback/cognito,本地开发就是http://localhost:3000/api/auth/callback/cognito,不要多末尾斜杠、不要写错路径,Cognito不会做路径自动规整。
  • 确认OpenID Connect范围至少勾选了openid,漏选的话Cognito不会返回id_token,直接触发OAuth回调校验失败。

3. 缓存&版本兜底

  • 清空当前访问域名下的所有浏览器cookie,尤其是next-auth.csrf-token、next-auth.callback-url相关缓存,旧版本残留的校验值会直接导致匹配失败。
  • 如果以上配置都确认无误仍报错,将next-auth升级到4.10.x以上的小版本即可,4.5.0版本存在已知的OAuth nonce校验bug,在Cognito返回非RS256签名的id_token时会误报mismatch,小版本升级无breaking change,完全兼容Next.js 12.1.6。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 06:33:21