如何使用Supabase对接第三方认证提供商FluffyScratch实现身份验证
自定义FluffyScratch认证对接Supabase实现方案
1. 确保生成的JWT符合Supabase校验规则
Supabase会自动校验传入的JWT合法性,你生成JWT时必须满足以下要求:
- 签名密钥必须使用你的Supabase项目对应的
JWT_SECRET,可在Supabase后台「项目设置 - API」页面获取 - JWT payload必须包含以下必填字段:
sub:填写从FluffyScratch获取的用户唯一ID,必须全局唯一role:固定填写authenticated,用于匹配Supabase行级安全(RLS)的已认证用户规则exp:设置JWT过期时间,建议设置为1~24小时,避免长期有效带来的安全风险
- 可选添加
user_metadata、app_metadata字段存储用户的Scratch用户名、头像等自定义信息,后续可直接在数据库侧读取
2. 前端注入JWT到Supabase客户端
你不需要调用GoTrue提供的signUp/signInWithPassword这类原生认证方法,直接使用Supabase客户端提供的setSession方法注入你生成的JWT即可:
// 从你的SvelteKit后端接口获取到生成的JWT后执行 const { error } = await supabase.auth.setSession({ access_token: "你生成的合法JWT字符串", refresh_token: "" // 暂未实现刷新token逻辑可填空,过期后引导用户重新走FluffyScratch认证流程 })
注入完成后,后续所有Supabase客户端的数据库请求都会自动携带该JWT,Supabase会自动完成身份校验和RLS规则匹配。
3. 可选:同步用户数据到Supabase auth表
如果你需要用到Supabase Auth的用户管理能力,可以在SvelteKit服务端接口校验FluffyScratch授权code有效后,使用Supabase Admin客户端同步用户到内置的auth.users表:
// 服务端初始化Admin客户端,注意service_role密钥绝对不能泄露到前端 import { createClient } from '@supabase/supabase-js' const supabaseAdmin = createClient( process.env.SUPABASE_URL, process.env.SUPABASE_SERVICE_ROLE_KEY, { auth: { autoRefreshToken: false, persistSession: false } } ) // 同步用户信息 const { data: user, error } = await supabaseAdmin.auth.admin.upsertUser({ id: 从FluffyScratch获取的用户ID, // 和JWT的sub字段保持一致 app_metadata: { provider: 'fluffyscratch', scratch_username: 从FluffyScratch获取的用户名 }, email_confirmed_at: new Date().toISOString() // 第三方认证直接标记为已确认 })
4. RLS规则适配
完成上述配置后,你编写行级安全策略时可直接使用auth.uid()获取当前登录用户的ID(即JWT中sub字段的值),示例规则如下:
-- 示例:仅允许用户操作自己创建的内容 CREATE POLICY "用户可访问自己的私有数据" ON private_table FOR ALL USING (user_id = auth.uid());
注意事项
- 所有JWT签名、用户同步逻辑必须放在服务端执行,禁止将
JWT_SECRET、SUPABASE_SERVICE_ROLE_KEY暴露到前端 - JWT payload仅可存储非敏感信息,JWT为明文编码,所有人都可解码查看内容
- 若需要实现JWT自动刷新,可自行维护refresh_token逻辑,过期后重新生成JWT调用
setSession更新即可
内容的提问来源于stack exchange,提问作者webdev03
相关产品推荐
相关产品推荐

