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

Next JS集成Supabase Auth遇重复报错:Invalid Refresh Token: Already Used

解决Next.js集成Supabase Auth时"Invalid Refresh Token: Already Used"报错

在Next.js项目中集成Supabase Auth功能,运行npm run dev时反复出现如下报错:

[AuthApiError: Invalid Refresh Token: Already Used]{
 __isAuthError: true,
name: 'AuthApiError',
status: 400
}

报错时有时无,甚至会持续循环,以下是针对性的解决办法:

1. 修正中间件响应返回逻辑

createMiddlewareClient需要通过返回修改后的res对象来正确更新Supabase的认证Cookie,否则会导致刷新令牌无法正常轮换,引发重复使用报错。

修改middleware中静态资源/API路由的判断逻辑:

if (
  req.nextUrl.pathname.startsWith("/_next") ||
  req.nextUrl.pathname.includes("/api/") ||
  PUBLIC_FILE.test(req.nextUrl.pathname)
) {
  return res; // 改为返回res,而非直接return;
}

2. 修复中间件匹配规则的拼写错误

配置中的matchter是拼写错误,会导致中间件匹配规则失效,引发不必要的重复请求处理:

export const config = {
  matcher: [ // 修正为正确的matcher
    "/",
    "/login",
    "/((?!api|_next/static|_next/image|assets|favicon.ico).*)",
  ],
};

3. 优化会话检查逻辑,避免自动重复刷新

getSession()会自动尝试刷新过期会话,若中间件被频繁触发,容易导致刷新令牌重复使用。改用getUser()减少自动刷新操作:

// 替换原有的getSession调用
const { data: { user } } = await supabase.auth.getUser();
const isAuthenticated = user?.role === "authenticated";

如果确实需要会话信息,可在确认用户已认证后再按需调用getSession(),避免无意义的刷新操作。

4. 避免重定向循环

检查重定向逻辑,确保不会因locale处理或认证校验触发无限循环:

  • 在处理登录页重定向时,确认目标路径不会再次触发相同的重定向规则
  • 确保敏感路由的重定向仅在用户未认证且未处于登录页时触发

5. 清理浏览器缓存与Cookie

旧的无效认证Cookie可能残留并引发错误,清除浏览器中Supabase相关的Auth Cookie,然后重启开发服务器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 20:57:53