我有一个自定义的 public.userProfiles 表,每次新用户注册时都会在其中创建一个新条目。 我想使用 public.userProfiles 表从我的应用程序中删除用户。 我不想从 Auth admin 公开 updateUser 方法,因为它涉及公开 service_role 键,因此我改为查看 public.userProfiles 表上的触发器。 一旦在 public.userProfiles 表中相应地编辑了用户行,它就会更新 user.data(设置 ban_duration)。
但是,我无法找到可以从更新用户配置文件的触发器中调用的函数。 有没有其他替代且安全的方法来实现这一目标?
您可以使用边缘功能进行用户自我删除。我已经发表了一篇关于它的博客文章。
这是处理这种情况的函数代码:
import { serve } from 'https://deno.land/[email protected]/http/server.ts'
import { createClient } from 'https://esm.sh/@supabase/supabase-js@2'
import { corsHeaders } from '../_shared/cors.ts'
console.log(`Function "user-self-deletion" up and running!`)
serve(async (req: Request) => {
// This is needed if you're planning to invoke your function from a browser.
if (req.method === 'OPTIONS') {
return new Response('ok', { headers: corsHeaders })
}
try {
// Create a Supabase client with the Auth context of the logged in user.
const supabaseClient = createClient(
// Supabase API URL - env var exported by default.
Deno.env.get('SUPABASE_URL') ?? '',
// Supabase API ANON KEY - env var exported by default.
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')! } } }
)
// Now we can get the session or user object
const {
data: { user },
} = await supabaseClient.auth.getUser()
// And we can run queries in the context of our authenticated user
const { data: profiles, error: userError } = await supabaseClient.from('profiles').select('id, avatar_url')
if (userError) throw userError
const user_id = profiles[0].id
const user_avatar = profiles[0].avatar_url
const supabaseAdmin = createClient(
Deno.env.get('SUPABASE_URL') ?? '',
Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? ''
)
const { data: avatar_deletion, error: avatar_error } = await supabaseAdmin
.storage
.from('avatars')
.remove([user_avatar.name])
if (avatar_error) throw avatar_error
console.log("Avatar deleted: " + JSON.stringify(avatar_deletion, null, 2))
const { data: deletion_data, error: deletion_error } = await supabaseAdmin.auth.admin.deleteUser(user_id)
if (deletion_error) throw deletion_error
console.log("User & files deleted user_id: " + user_id)
return new Response("User deleted: " + JSON.stringify(deletion_data, null, 2), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 200,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
headers: { ...corsHeaders, 'Content-Type': 'application/json' },
status: 400,
})
}
})