Supabase+Next.js:如何仅让已认证用户访问修改密码页面
解决Next.js + Supabase密码重置页面的授权问题
问题出在密码重置链接的token还未被Supabase处理成有效会话时,你的middleware就直接检查用户身份,导致返回null并触发重定向。以下是修复方案:
核心原因
当用户点击Supabase发送的密码重置链接时,URL中会携带一次性授权token,但此时Supabase客户端还未完成token与会话的交换,直接调用getUser()或getSession()自然返回null。
修复步骤
1. 调整Middleware逻辑,先处理Auth回调
修改middleware代码,先调用getSession()——这个方法会自动识别URL中的auth参数(如access_token、code)并完成会话建立,之后再判断是否允许访问:
export async function middleware(req: NextRequest) { const res = NextResponse.next(); const supabase = createMiddlewareClient({ req, res }); // 先处理URL中的Auth回调参数,建立会话 const { data: { session } } = await supabase.auth.getSession(); // 仅当无有效会话且访问修改密码页面时,才重定向到登录页 if (!session && req.nextUrl.pathname.startsWith('/update-password')) { return NextResponse.redirect(new URL('/sign-in', req.url)); } return res; }
2. 检查路径一致性
注意你调用resetPasswordForEmail时设置的redirectTo是/change-password,但middleware拦截的是/update-password——这两个路径必须完全一致,否则会导致用户被重定向到错误页面,且会话未正确建立。
3. 验证Supabase Auth设置
确保你的Supabase项目控制台中,Auth > URL Configuration里的:
Site URL已填写你的应用根域名(如http://localhost:3000)Additional Redirect URLs已添加修改密码页面的完整URL(如http://localhost:3000/update-password)
这一步是必须的,否则Supabase会拒绝将用户重定向到未授权的URL。
内容的提问来源于stack exchange,提问作者AbedDoesCode
相关产品推荐
相关产品推荐

