边缘函数

与 Supabase Auth 集成

Supabase 边缘函数与认证系统。


边缘函数与 Supabase Auth 无缝协作。

认证上下文

当用户向边缘函数发起请求时,您可以使用 Authorization 头部在 Supabase 客户端中设置认证上下文:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import { 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) 策略强制执行的用户上下文中执行查询。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { 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 客户端后,所有查询都将以用户上下文执行。对于数据库查询,这意味着将强制执行行级安全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { 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 上的完整示例