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

Next-Auth登录后Middleware触发无限循环问题求助

问题原因及修复方案

问题1:Middleware未放行登录页面

你的Middleware没有将登录页面路径(/auth/signin)加入放行列表,导致未登录用户访问登录页面时,会被Middleware判定为未授权,进而重定向到登录页面引发循环;即使登录后,也可能因路由跳转的中间态触发重复重定向。

修复:在Middleware的路径判断中新增登录页面的放行逻辑:

export default withAuth({
  callbacks: {
    authorized: async ({ req, token }) => {
      const pathname = req.nextUrl.pathname;

      if (
        pathname.startsWith("/_next") ||
        pathname === "/favicon.ico" ||
        pathname === "/__ENV.js" ||
        pathname === "/auth/signin" // 新增:放行登录页面
      ) {
        return true;
      }

      if (token) {
        return true;
      }

      return false;
    },
  },
  secret: "test",
  pages: {
    signIn: "/auth/signin",
  },
});

问题2:SignIn页面未处理session加载状态

页面加载时useSession的status会处于loading状态,此时session为null,原代码会触发signIn调用。若用户已登录,signIn会自动回调到登录页面,导致无限循环跳转。同时原代码未利用callbackUrl参数,跳转逻辑不符合预期。

修复:在useEffect中先判断status是否为loading,仅在未认证状态下触发登录;同时使用callbackUrl实现正确跳转:

import { signIn, useSession } from "next-auth/react";
import { useEffect } from "react";
import { useRouter } from "next/router";

export default function Signin() {
  const router = useRouter();
  const { data: session, status } = useSession();
  const { callbackUrl } = router.query; // 获取回调URL

  useEffect(() => {
    if (status === "unauthenticated" || session?.error === "RefreshAccessTokenError") {
      signIn("keycloak", { callbackUrl: callbackUrl || "/" }); // 传入回调URL
    } else if (status === "authenticated") {
      router.push(callbackUrl || "/"); // 跳转到回调URL,而非固定根路径
    }
  }, [session, router, status, callbackUrl]);

  return <div></div>;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:15:43