Next-Auth登出后如何重定向到.env配置的URL?
问题描述
我想用Next-Auth实现登出后重定向到.env.local中配置的外部URL,当前.env.local配置:
NEXT_PUBLIC_BASE_URL=https://www.instagram.com.ar/
我的sidebar.tsx代码:
<a onClick={() => signOut({ callbackUrl: process.env.NEXT_PUBLIC_BASE_URL })} className="flex items-center p-2 text-gray-900 rounded-lg hover:bg-red-100 group cursor-pointer"> <FiLogOut size={25} /> <span className="flex-1 ml-3 whitespace-nowrap">Cerrar Sesión</span> </a>
api/[nextauth]/route.ts代码:
const handler = NextAuth({ providers: [ CredentialsProvider({ name: "Credentials", credentials: { email: { label: "email", type: "email", placeholder: "test@test.com" }, password: { label: "Password", type: "password" }, }, async authorize(credentials) { const res = await fetch( `${process.env.NEXT_PUBLIC_BACKEND_URL}/auth/login`, { method: "POST", body: JSON.stringify({ email: credentials?.email, password: credentials?.password, }), headers: { "Content-Type": "application/json" }, } ); const user = await res.json(); if (user.error) throw user; return user; }, }), ], callbacks: { async jwt({ token, user }) { return { ...token, ...user }; }, async session({ session, token }) { session.user = token as any; return session; }, }, pages: { signIn: "/login", }, }); export { handler as GET, handler as POST };
我试过直接把callbackUrl设为'www.instagram.com.ar',但还是没法重定向,该怎么解决?
解决方法
NextAuth默认仅允许重定向到同域名或已配置的授权域名,外部域名需在NextAuth配置中明确授权,具体步骤如下:
添加授权重定向域名配置
在api/[nextauth]/route.ts的NextAuth初始化参数中,添加authorizedRedirectUrls数组(适用于NextAuth v4+),将目标外部URL纳入允许列表:const handler = NextAuth({ // 保留原有providers、callbacks、pages配置 authorizedRedirectUrls: [process.env.NEXT_PUBLIC_BASE_URL], });若使用旧版NextAuth,需改用
redirect配置:const handler = NextAuth({ // 保留原有配置 redirect: { allowed: [process.env.NEXT_PUBLIC_BASE_URL] } });注意:必须传入完整URL(包含
https://),不能仅填域名。验证环境变量读取正确性
在sidebar.tsx中打印环境变量,确认process.env.NEXT_PUBLIC_BASE_URL已正确加载:console.log(process.env.NEXT_PUBLIC_BASE_URL);若输出为空或格式错误,需重启Next.js开发服务器(修改
.env.local后必须重启才能生效)。处理NextAuth v5版本适配
若使用NextAuth v5,需通过redirects回调配置允许的重定向地址:const handler = NextAuth({ // 保留原有配置 redirects: async () => { return { allow: [process.env.NEXT_PUBLIC_BASE_URL], }; }, });标准化URL格式
避免URL末尾斜杠不一致导致的问题,可通过URL对象标准化格式:const targetUrl = new URL(process.env.NEXT_PUBLIC_BASE_URL!).href; // 然后在signOut中使用:signOut({ callbackUrl: targetUrl })
内容的提问来源于stack exchange,提问作者Francisco Albert
相关产品推荐
相关产品推荐

