Next-Auth中间件问题:未认证用户无法访问注册页面
问题解决:Next-Auth中间件阻止未认证用户访问注册页
问题原因
你当前的代码中,withAuth中间件会对匹配的/login和/register路由进行强制认证校验——未认证用户访问这些路由时,会自动跳转到signIn配置的/login页面,这直接导致未认证用户无法进入注册页。同时原代码仅单独处理了/login的已认证重定向逻辑,未覆盖/register的情况。
修复后的代码
import { getToken } from 'next-auth/jwt' import { NextFetchEvent, NextRequest, NextResponse } from 'next/server' export default async function middleware( req: NextRequest, event: NextFetchEvent ) { const token = await getToken({ req }) const isAuthenticated = !!token const currentPath = req.nextUrl.pathname // 处理登录/注册路由:已认证用户禁止访问,未认证用户直接放行 if (currentPath === '/login' || currentPath === '/register') { if (isAuthenticated) { return NextResponse.redirect(new URL('/profile', req.url)) } return NextResponse.next() } // 如需保护其他路由(比如/profile),可在此添加withAuth逻辑 // const authMiddleware = withAuth({ // pages: { // signIn: '/login', // }, // }) // return authMiddleware(req, event) } export const config = { matcher: ['/login', '/register', '/profile'], // 按需添加需要保护的路由 }
逻辑说明
- 认证状态判断:通过
getToken获取用户令牌,判断是否已认证 - 登录/注册路由处理:
- 已认证用户访问
/login或/register时,直接重定向到个人中心/profile - 未认证用户访问时,直接放行,允许进入登录或注册页面
- 已认证用户访问
- 其他路由保护:如果有需要强制认证的路由(如
/profile),可取消注释withAuth相关代码,实现未认证用户自动跳转到登录页的逻辑
内容的提问来源于stack exchange,提问作者ponwock
相关产品推荐
相关产品推荐

