Next-Auth谷歌认证后无法自动重定向至原页面问题排查
核心问题:谷歌Provider手动指定redirect_uri导致回调参数丢失
你在GoogleProvider配置里手动设置了redirect_uri: 'http://localhost:3000/api/auth/callback/google',这会覆盖NextAuth自动生成的、包含callbackUrl参数的回调地址。谷歌认证完成后,只会跳转到这个固定地址,无法携带之前的callbackUrl(也就是/home/form),导致NextAuth不知道认证成功后该重定向到哪里,最终停留在登录页。
修复步骤
1. 移除谷歌Provider中的手动redirect_uri配置
修改src\app\api\auth\[...nextauth]\route.ts里的GoogleProvider部分,删掉authorization下的redirect_uri参数:
GoogleProvider({ clientId: process.env.GOOGLE_CLIENT_ID as string, clientSecret: process.env.GOOGLE_CLIENT_SECRET as string, // 删掉以下手动配置的redirect_uri段落 // authorization: { // params: { // redirect_uri: 'http://localhost:3000/api/auth/callback/google' // } // } }),
NextAuth会自动根据当前环境生成正确的回调地址,包含callbackUrl参数,确保认证完成后能正确跳转。
2. 确认signIn调用逻辑
你的登录按钮调用signIn(providerName)时,NextAuth会自动从当前URL的callbackUrl参数中读取目标地址,当前写法是正确的。如果是主动触发登录(非middleware重定向场景),可以手动传入callbackUrl参数:
const handleClick = (providerName: string) => { signIn(providerName, { callbackUrl: "/home/form" }); }
但你的场景是从受保护页面被重定向到登录页,URL里已自带callbackUrl,无需改动这部分。
3. 验证pages配置一致性
你的middleware和authConfig里的pages.signIn都设置为/home/auth,这部分配置正确,确保未认证用户访问受保护路由时,会被重定向到正确的登录页并携带callbackUrl。
测试验证
修改后重启开发服务器,访问/home/form,会被重定向到/home/auth?callbackUrl=%2Fhome%2Fform,点击谷歌登录,认证完成后应该会自动跳转到/home/form。
内容的提问来源于stack exchange,提问作者SMTP King

