NextAuth GoogleProvider登录报错:OAUTH_CALLBACK_ERROR(checks.state缺失)
NextAuth v4.18.8 GoogleProvider 回调错误:checks.state argument is missing
问题背景
JS全栈项目使用NextAuth v4.18.8的GoogleProvider实现登录,今早功能正常运行过一次,提交代码后出现回调错误。已确认env.local中GOOGLE_CLIENT_ID和GOOGLE_CLIENT_SECRET配置正确,且删除重建过Google凭证,问题依旧。
错误日志
[next-auth][error][OAUTH_CALLBACK_ERROR] https://next-auth.js.org/errors#oauth_callback_error checks.state argument is missing { error: TypeError: checks.state argument is missing at Client.callback (.../openid-client/lib/client.js:387:13) at oAuthCallback (.../next-auth/core/lib/oauth/callback.js:127:29) ...(省略后续栈信息) name: 'OAuthCallbackError', code: undefined }, providerId: 'google', message: 'checks.state argument is missing'
网络请求异常
点击Google账号授权后:
consent?authuser=0&part=....返回302google?state=......返回302http://127.0.0.1:3000/api/auth/error?error=OAuthCallback返回302并报错http://127.0.0.1:3000/api/auth/signin?error=OAuthCallback返回404
相关代码
登录按钮函数:
const handleGoogleLogin = async () => { await signIn('google', { redirect: true, callbackUrl: 'http://127.0.0.1:3000/user/dashboard' }) }
[...nextauth].js:
export const authOptions = { providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET }) ], session: { strategy: "jwt" }, jwt: { secret: process.env.JWT_TOKEN }, adapter: MongooseAdapter(process.env.MONGODB_URI), } export default NextAuth(authOptions)
解决方案
1. 验证Google控制台回调URL配置
进入Google Cloud控制台的API和服务 -> 凭据,找到对应OAuth客户端ID,确保已添加完全匹配的回调URL:http://127.0.0.1:3000/api/auth/callback/google
注意:必须和项目运行地址一致,不要混用localhost和127.0.0.1。
2. 统一项目访问地址
本地开发全程使用http://127.0.0.1:3000访问项目,signIn的callbackUrl也保持相同域名,避免跨域或Cookie不匹配问题。
3. 调整NextAuth Cookie配置
在authOptions中添加Cookie配置,确保state参数对应的Cookie能被正确携带:
export const authOptions = { providers: [ GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID, clientSecret: process.env.GOOGLE_CLIENT_SECRET }) ], session: { strategy: "jwt" }, jwt: { secret: process.env.JWT_TOKEN }, // 新增Cookie配置 cookies: { sessionToken: { name: `next-auth.session-token`, options: { httpOnly: true, sameSite: 'lax', path: '/', secure: process.env.NODE_ENV === 'production' } }, callbackUrl: { name: `next-auth.callback-url`, options: { sameSite: 'lax', path: '/', secure: process.env.NODE_ENV === 'production' } }, csrfToken: { name: `next-auth.csrf-token`, options: { httpOnly: true, sameSite: 'lax', path: '/', secure: process.env.NODE_ENV === 'production' } } }, // 暂时注释适配器测试 // adapter: MongooseAdapter(process.env.MONGODB_URI), } export default NextAuth(authOptions)
4. 清除缓存并重启服务
- 清除浏览器中
127.0.0.1域名下的所有Cookie和缓存 - 关闭当前Next.js开发服务器,重新执行
npm run dev启动
5. 排查适配器影响
暂时注释掉adapter配置,重新启动服务测试登录。如果恢复正常,说明MongoDB适配器可能存在连接问题或版本兼容性问题,需要检查MongoDB URI是否正确,或更新MongooseAdapter版本。
内容的提问来源于stack exchange,提问作者João Textor
相关产品推荐
相关产品推荐

