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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 14:00:13