Auth.js/NextAuth 登录成功后无法自动跳转至指定页面
Auth.js/NextAuth 登录成功后无法自动跳转至指定页面
看起来你遇到的问题是NextAuth Google登录验证通过后,没有自动跳转到你指定的/dashboard/inventory,而是停留在首页。我帮你分析下代码里的问题和解决办法:
问题根源
你已经在SignInWithGoogle服务器动作中传递了callbackUrl: "/dashboard/inventory",也在signIn回调里验证邮箱存在后返回了true,但在NextAuth v5中,仅返回true可能不会自动使用你传入的callbackUrl,需要更明确地处理跳转逻辑。
解决办法
方案1:在signIn回调中返回传入的callbackUrl
修改app/auth.js中的signIn回调,接收callbackUrl参数并在验证通过后返回它:
import NextAuth from "next-auth" import Google from "next-auth/providers/google" import { supabase } from "@/lib/supabase" export const { handlers, auth, signIn, signOut } = NextAuth({ providers: [Google], callbacks: { // 新增callbackUrl参数到signIn回调 async signIn({ user, callbackUrl }) { const { data, error } = await supabase .from('stores') .select() .eq('email', user.email) .single() if (error || !data) { return '/error' } // 验证通过后返回指定的callbackUrl,替代原来的true return callbackUrl }, }, pages: { error: '/error' } })
这样NextAuth会明确跳转到你指定的回调地址,而不是默认首页。
方案2:添加redirect回调强制处理跳转
如果方案1不生效,可以在callbacks中新增redirect回调,确保登录成功后优先使用传入的callbackUrl:
import NextAuth from "next-auth" import Google from "next-auth/providers/google" import { supabase } from "@/lib/supabase" export const { handlers, auth, signIn, signOut } = NextAuth({ providers: [Google], callbacks: { async signIn({ user }) { const { data, error } = await supabase .from('stores') .select() .eq('email', user.email) .single() if (error || !data) { return '/error' } return true }, // 新增redirect回调 async redirect({ callbackUrl, baseUrl }) { // 确保callbackUrl是同域名的合法地址 if (callbackUrl.startsWith(baseUrl)) { return callbackUrl } // fallback到首页(可选,根据你的需求调整) return baseUrl } }, pages: { error: '/error' } })
额外检查点
- 确认Google OAuth应用的回调URL配置正确:本地环境应为
http://localhost:3000/api/auth/callback/google,生产环境替换成你的实际域名 - 检查你的
middleware.js,确保它没有错误地将已登录用户重定向回首页 - 打开浏览器开发者工具的网络面板,查看Google授权完成后的回调请求,确认返回的302跳转地址是否为
/dashboard/inventory
备注:内容来源于stack exchange,提问作者mukunda
相关产品推荐
相关产品推荐

