与 Supabase Auth 集成
Supabase 边缘函数与认证系统。
边缘函数与 Supabase Auth 无缝协作。
认证上下文
当用户向边缘函数发起请求时,您可以使用 Authorization 头部在 Supabase 客户端中设置认证上下文:
123456789101112131415import { createClient } from 'jsr:@supabase/supabase-js@2'Deno.serve(async (req: Request) => { const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', ); // 获取会话或用户对象 const authHeader = req.headers.get('Authorization')!; const token = authHeader.replace('Bearer ', ''); const { data } = await supabaseClient.auth.getUser(token);})
关键点在于,这个操作是在 Deno.serve()
回调函数参数 内部 完成的,这样就能为每个请求设置 Authorization 头部。
获取用户信息
使用认证上下文初始化 Supabase 客户端后,您可以通过 getUser()
获取用户对象,并在 行级安全(RLS) 策略强制执行的用户上下文中执行查询。
123456789101112131415161718192021import { createClient } from 'jsr:@supabase/supabase-js@2'Deno.serve(async (req: Request) => { const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', ) // 获取会话或用户对象 const authHeader = req.headers.get('Authorization')! const token = authHeader.replace('Bearer ', '') const { data } = await supabaseClient.auth.getUser(token) const user = data.user return new Response(JSON.stringify({ user }), { headers: { 'Content-Type': 'application/json' }, status: 200, })})
行级安全
在使用 Auth 上下文初始化 Supabase 客户端后,所有查询都将以用户上下文执行。对于数据库查询,这意味着将强制执行行级安全。
123456789101112131415161718192021import { createClient } from 'jsr:@supabase/supabase-js@2'Deno.serve(async (req: Request) => { const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', ); // 获取会话或用户对象 const authHeader = req.headers.get('Authorization')!; const token = authHeader.replace('Bearer ', ''); const { data: userData } = await supabaseClient.auth.getUser(token); const { data, error } = await supabaseClient.from('profiles').select('*'); return new Response(JSON.stringify({ data }), { headers: { 'Content-Type': 'application/json' }, status: 200, })})
示例代码
查看 GitHub 上的完整示例。