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

