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
相关产品推荐
相关产品推荐

