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

如何在Supabase与NextJS中实现自定义JWT认证及RLS?

在Supabase + Next.js Pages目录下配置自定义认证与RLS的问题

我正在Supabase和Next.js Pages目录中配置自定义认证及行级安全(RLS),但参考的教程已过时,目前卡在生成JWT并启动用户会话的环节——旧教程里的auth.setAuth()方法已被移除,不清楚当前Next.js中的实现方式。

表结构与RLS规则

  • 我有public.users表,其id列是auth.users表id列的外键副本
  • 已启用RLS,UPDATE检查规则设置为(auth.uid() = id)

代码片段

/api/auth/login.ts(简化版)

const handler = async (req: NextApiRequest, res: NextApiResponse) => {
  const { email } = req.body

  // createPagesServerClient 来自 supabase 的 auth-helpers 模块
  const supabaseServerClient = createPagesServerClient({
    req,
    res,
  });
  // getUserByEmail 从 public.users 表通过邮箱获取用户
  let user = await getUserByEmail(email, supabaseServerClient);
  if(user){ // 用户已存在
    const newSecret = generateSecret();  // 生成随机字符串
    const token = genCookie(user, req, res) // 生成JWT(见下方genCookie函数)

    supabaseServerClient.functions.setAuth(token)
    supabaseServerClient.realtime.setAuth(token)

    const {data:users, error} = await supabase
      .from("users") // public.users 表
      .update({secret: newSecret })
      .eq("email", email)
      .select();
    if(!user){
      return res.status(422).json({ error: "Could not update user " + reconstructedAddress});
    }
    return res.send(users[0])
  } else {
    // 错误处理
  }
}

genCookie函数

const genCookie = (user:SupabaseUser, req:IncomingMessage, res:ServerResponse)=>{
  const token = jwt.sign({ id:user.id, email:user.email }, process.env.JWT_SECRET ); // JWT_SECRET 来自Supabase控制台

  // 有用户建议用 sub: user.id 替代 id,但同样无效
  return token
}

问题详情

策略检查未生效:上述UPDATE查询返回error=null但users=[],但用户实际存在。我对当前的认证逻辑理解可能有误,需要指导。

依赖版本

"@supabase/auth-helpers-nextjs": "^0.7.2",
"@supabase/auth-helpers-react": "^0.4.0",
"@supabase/supabase-js": "^2.24.0",

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 22:20:31