Next.js集成Supabase时服务端无法正常登出用户的问题求解
Supabase服务端登出失效原因
你之前的代码只调用了signOut接口作废传入的access_token,但漏掉了最核心的步骤:清除请求/响应上下文中存储的Supabase认证Cookie。
接口返回{ error: null }只代表服务端已经把你传入的那个access_token加入了黑名单,但客户端(包括服务端渲染上下文)里存储的refresh_token没有被清除,重定向后Supabase客户端检测到本地存在有效refresh_token,就会自动触发TOKEN_REFRESH流程,拉取新的access_token恢复登录状态,看起来就像登出操作完全没生效。
正确实现方式
针对你用的Supabase v1 + Next.js getServerSideProps场景,完整登出逻辑需要覆盖三个环节:
- 调用登出接口作废当前会话的access_token,可通过scope参数控制登出范围:传
local仅作废当前端会话,传global会作废该用户所有登录端的会话 - 手动清除Supabase写入的所有认证相关Cookie,从根源上阻止自动token刷新
- 完成上述操作后再执行登录页重定向
完整参考代码如下:
export const getServerSideProps: GetServerSideProps = withPageAuth({ redirectTo: '/auth/sign-in', authRequired: true, async getServerSideProps(ctx) { const supabase = supabaseServerClient(ctx); const session = await supabase.auth.session(); // 调用接口作废当前token await supabase.auth.api.signOut(session!.access_token, 'local'); // 清除上下文里的所有Supabase认证Cookie const projectRef = process.env.NEXT_PUBLIC_SUPABASE_URL!.split('//')[1].split('.')[0]; const authCookies = [ 'sb-access-token', 'sb-refresh-token', `sb-${projectRef}-auth-token` ]; authCookies.forEach(cookieName => { ctx.res.setHeader( 'Set-Cookie', `${cookieName}=; Path=/; HttpOnly; Max-Age=0; SameSite=Lax` ); }); return { redirect: { permanent: false, destination: '/auth/sign-in', } } } });
如果你升级到Supabase v2版本SDK,服务端登出逻辑会更简单:直接调用
supabase.auth.signOut()方法会自动处理当前上下文的Cookie清除,不需要手动编写Set-Cookie逻辑。
内容的提问来源于stack exchange,提问作者Damian Kociszewski
相关产品推荐
相关产品推荐

