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

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配置中明确授权,具体步骤如下:

  1. 添加授权重定向域名配置
    在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://),不能仅填域名。

  2. 验证环境变量读取正确性
    在sidebar.tsx中打印环境变量,确认process.env.NEXT_PUBLIC_BASE_URL已正确加载:

    console.log(process.env.NEXT_PUBLIC_BASE_URL);
    

    若输出为空或格式错误,需重启Next.js开发服务器(修改.env.local后必须重启才能生效)。

  3. 处理NextAuth v5版本适配
    若使用NextAuth v5,需通过redirects回调配置允许的重定向地址:

    const handler = NextAuth({
      // 保留原有配置
      redirects: async () => {
        return {
          allow: [process.env.NEXT_PUBLIC_BASE_URL],
        };
      },
    });
    
  4. 标准化URL格式
    避免URL末尾斜杠不一致导致的问题,可通过URL对象标准化格式:

    const targetUrl = new URL(process.env.NEXT_PUBLIC_BASE_URL!).href;
    // 然后在signOut中使用:signOut({ callbackUrl: targetUrl })
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 16:56:13