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

Next.js API路由无法获取Supabase用户的问题求助

解决Supabase API路由中无法获取用户的问题

问题分析

你遇到的Invalid token: token contains an invalid number of segments错误,核心原因是在API路由中手动读取sb-access-token cookie并传递给getUser的方式有误,导致Supabase无法解析有效JWT。而getServerSideProps能正常获取用户,是因为它直接使用了Supabase的getUserByCookie方法正确处理了cookie。

具体修复步骤

1. 用Auth Helpers工具函数获取用户

放弃手动读取cookie的方式,直接使用@supabase/auth-helpers-nextjs提供的getUser函数,它会自动处理cookie的读取和验证:

修改src/pages/api/board.ts:

import prisma from 'Utilities/PrismaClient'
import { getUser } from '@supabase/auth-helpers-nextjs'

export default async function handler (req, res) {
  
  if (req.method === 'GET') {
    // 直接通过getUser获取用户,无需手动传token
    const { user, error } = await getUser({ req, res })

    if (error || !user) {
      return res.status(401).json({ error: error?.message || 'Unauthorized' })
    }

    // 仅查询当前用户所属的boards(需确保board表有userId关联字段)
    const result = await prisma.board.findMany({
      where: { userId: user.id },
      select: {
        name: true,
        id: true,
        user: true,
        description: true
      }
    })
    res.json({ boards: result })
  }

  if (req.method === 'POST') {
    const { user, error } = await getUser({ req, res })

    if (error || !user) {
      return res.status(401).json({ error: error?.message || 'Unauthorized' })
    }

    const { name, description } = req.body
    const result = await prisma.board.create({
      data: {
        name,
        description,
        userId: user.id // 关联当前用户ID
      }
    })
    res.status(201).json({ board: result })
  }
}

2. 确保API请求携带Credentials

前端发起API请求时,必须携带cookie才能让服务端验证用户身份。修改handleGetBoards函数,添加withCredentials配置:

async function handleGetBoards(req) {
  return axios.get(`${getBaseUrl(req)}/api/board`, {
    withCredentials: true // 强制携带cookie
  })
  .then(({data}) => data.boards)
  .catch(err => console.log(err))
}

3. 检查Supabase客户端Cookie配置

确认你的Supabase客户端配置了正确的cookie选项,确保cookie能在整个站点内有效传递:

// src/Utilities/SupabaseClient.ts
import { createClient } from '@supabase/supabase-js'

const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL
const supabaseAnonKey = process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY

export default createClient(supabaseUrl, supabaseAnonKey, {
  auth: {
    cookieOptions: {
      sameSite: 'lax',
      path: '/',
      maxAge: 60 * 60 * 24 * 7 // 7天有效期
    }
  }
})

4. 验证Auth路由的正确性

你的/api/auth路由代码是正确的,但需确保它能在用户登录状态变化时正确设置cookie:

// src/api/auth.js
import supabase from 'Utilities/SupabaseClient'

export default function handler (req, res) {
  supabase.auth.api.setAuthCookie(req, res)
}

内容的提问来源于stack exchange,提问作者Neil Girardi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:45:42