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

