与 Supabase Auth 集成
Integrate Supabase Auth with Edge Functions
Edge Functions 可以与 Supabase Auth 一起使用。
🌐 Edge Functions work with Supabase Auth.
这让你可以:
🌐 This allows you to:
- 通过传统 JWT 令牌自动识别用户
- 执行行级别安全策略
- 与你现有的认证流程集成
设置认证上下文 #
🌐 Setting up auth context
当用户向 Edge Function 发出请求时,你可以使用 Authorization 头在 Supabase 客户端中设置 Auth 上下文,并执行行级安全策略。
🌐 When a user makes a request to an Edge Function, you can use the Authorization header to set the Auth context in the Supabase client and enforce Row Level Security policies.
import { createClient } from 'npm:@supabase/supabase-js@2'Deno.serve(async (req: Request) => { const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_ANON_KEY') ?? '', // Create client with Auth context of the user that called the function. // This way your row-level-security (RLS) policies are applied. { global: { headers: { Authorization: req.headers.get('Authorization')! }, }, } ); //...})这个上下文设置发生在 Deno.serve() 回调参数中,因此 Authorization 头会为每个单独的请求范围设置。
🌐 This context setting happens in the Deno.serve() callback argument, so that the Authorization header is set for each individual request scope.
正在获取用户 #
🌐 Fetching the user
通过从 Authorization 头获取 JWT,你可以把这个令牌提供给 getUser() 来获取用户对象,从而获取已登录用户的元数据。
🌐 By getting the JWT from the Authorization header, you can provide the token to getUser() to fetch the user object to obtain metadata for the signed-in user.
Deno.serve(async (req: Request) => { // ... const authHeader = req.headers.get('Authorization')! const token = authHeader.replace('Bearer ', '') const { data } = await supabaseClient.auth.getUser(token) // ...})行级安全 #
🌐 Row Level Security
在使用 Auth 上下文初始化 Supabase 客户端后,所有查询都会以用户的上下文执行。对于数据库查询,这意味着会强制执行行级安全。
🌐 After initializing a Supabase client with the Auth context, all queries will be executed with the context of the user. For database queries, this means Row Level Security will be enforced.
import { createClient } from 'npm:@supabase/supabase-js@2'Deno.serve(async (req: Request) => { // ... // This query respects RLS - users only see rows they have access to const { data, error } = await supabaseClient.from('profiles').select('*'); if (error) { return new Response('Database error', { status: 500 }) } // ...})示例 #
🌐 Example
查看完整的 示例在 GitHub 上。
🌐 See the full example on GitHub.
// Follow this setup guide to integrate the Deno language server with your editor:// https://deno.land/manual/getting_started/setup_your_environment// This enables autocomplete, go to definition, etc.import { withSupabase } from 'npm:@supabase/server@^1'console.log(`Function "select-from-table-with-auth-rls" up and running!`)export default { fetch: withSupabase({ auth: 'user' }, async (req, ctx) => { try { // ctx.supabase runs queries as the authenticated user, so RLS applies. // ctx.userClaims holds the verified user identity. const { data, error } = await ctx.supabase.from('users').select('*') if (error) throw error return Response.json({ user: ctx.userClaims, data }) } catch (error) { return Response.json({ error: error.message }, { status: 400 }) } }),}// To invoke (auth: 'user' requires a signed-in user's access token):// curl -i --location --request POST 'http://localhost:54321/functions/v1/select-from-table-with-auth-rls' \// --header 'Authorization: Bearer <USER_ACCESS_TOKEN>' \// --header 'Content-Type: application/json' \// --data '{"name":"Functions"}'