Integrating With Supabase Auth
Supabase Edge Functions and Auth.
Edge Functions work seamlessly with Supabase Auth.
Auth context
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:
_15import { createClient } from 'jsr:@supabase/supabase-js@2'_15_15Deno.serve(async (req: Request) => {_15_15 const supabaseClient = createClient(_15 Deno.env.get('SUPABASE_URL') ?? '',_15 Deno.env.get('SUPABASE_ANON_KEY') ?? '',_15 );_15_15 // Get the session or user object_15 const authHeader = req.headers.get('Authorization')!;_15 const token = authHeader.replace('Bearer ', '');_15 const { data } = await supabaseClient.auth.getUser(token);_15_15})
Importantly, this is done inside the Deno.serve()
callback argument, so that the Authorization header is set for each request.
Fetching the user
After initializing a Supabase client with the Auth context, you can use getUser()
to fetch the user object, and run queries in the context of the user with Row Level Security (RLS) policies enforced.
_21import { createClient } from 'jsr:@supabase/supabase-js@2'_21_21Deno.serve(async (req: Request) => {_21_21 const supabaseClient = createClient(_21 Deno.env.get('SUPABASE_URL') ?? '',_21 Deno.env.get('SUPABASE_ANON_KEY') ?? '',_21 )_21_21 // Get the session or user object_21 const authHeader = req.headers.get('Authorization')!_21 const token = authHeader.replace('Bearer ', '')_21 const { data } = await supabaseClient.auth.getUser(token)_21 const user = data.user_21_21 return new Response(JSON.stringify({ user }), {_21 headers: { 'Content-Type': 'application/json' },_21 status: 200,_21 })_21_21})
Row Level Security
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.
_21import { createClient } from 'jsr:@supabase/supabase-js@2'_21_21Deno.serve(async (req: Request) => {_21_21 const supabaseClient = createClient(_21 Deno.env.get('SUPABASE_URL') ?? '',_21 Deno.env.get('SUPABASE_ANON_KEY') ?? '',_21 );_21_21 // Get the session or user object_21 const authHeader = req.headers.get('Authorization')!;_21 const token = authHeader.replace('Bearer ', '');_21 const { data: userData } = await supabaseClient.auth.getUser(token);_21 const { data, error } = await supabaseClient.from('profiles').select('*');_21_21 return new Response(JSON.stringify({ data }), {_21 headers: { 'Content-Type': 'application/json' },_21 status: 200,_21 })_21_21})
Example code
See a full example on GitHub.