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

如何访问Supabase访问令牌?Next.js13本地域Cookie读取问题求助

解决方案:Next.js 13 + Supabase v2 令牌Cookie无法在中间件读取问题

1. 修正Supabase客户端的Cookie配置

初始化Supabase客户端时,必须明确指定Cookie参数,确保开发环境下Cookie绑定到localhost:

// utils/supabase/server.ts 或 client.ts
import { createClient } from '@supabase/supabase-js';

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL!;
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!;

export const supabase = createClient(supabaseUrl, supabaseKey, {
  auth: {
    cookieOptions: {
      domain: process.env.NODE_ENV === 'development' ? 'localhost' : '你的生产域名',
      path: '/',
      secure: process.env.NODE_ENV === 'production', // 开发环境设为false,适配localhost的HTTP协议
      sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax',
      maxAge: 60 * 60 * 24 * 7, // 可选,设置Cookie有效期
    },
  },
});

同时前往Supabase控制台「设置」->「API」页面,将「站点URL」设为http://localhost:3000(开发环境),确保Supabase允许该域名的Cookie操作。

2. 正确在Next.js中间件中读取Cookie

Next.js 13中间件运行在服务端,需通过Request对象的cookies方法读取,不能使用浏览器的document.cookie:

// middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { supabase } from '@/utils/supabase/server';

export async function middleware(request: NextRequest) {
  // 读取Supabase的访问令牌Cookie
  const accessToken = request.cookies.get('sb-access-token')?.value;

  if (!accessToken) {
    // 未登录状态重定向到登录页
    return NextResponse.redirect(new URL('/login', request.url));
  }

  // 可选:验证令牌有效性
  const { data: user, error } = await supabase.auth.getUser(accessToken);
  if (error || !user) {
    return NextResponse.redirect(new URL('/login', request.url));
  }

  return NextResponse.next();
}

// 指定中间件作用路径(排除静态资源和API接口)
export const config = {
  matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
};

3. 清除旧Cookie并重新测试

浏览器可能缓存了之前域名不匹配的Cookie,先清除localhost相关的Cookie,重新登录生成新Cookie后再测试中间件读取逻辑。

4. HTTPS开发环境适配(可选)

如果你的Next.js开发环境启用了HTTPS(如使用next dev --experimental-https),需将cookieOptions.secure设为true,同时Supabase控制台的站点URL改为https://localhost:3000。

内容的提问来源于stack exchange,提问作者Gavi Salcedo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:15:12