Supabase Edge Function创建用户报错:邮箱未授权,无代码变更却失效
你遇到的这个错误,虽然代码和本地配置未做修改,但大概率是Supabase控制台的Auth配置发生了变化,以下是几个必查的关键点:
检查授权邮箱域名列表
进入Supabase控制台→Authentication→Settings→Authorized Domains,确认你用来创建用户的邮箱域名(比如gmail.com、自定义企业域名)在列表中。如果域名被误删或未添加,就会触发该错误。验证Email Provider的域名限制
前往Authentication→Providers→Email,查看“Allowed email domains”设置。如果这里指定了特定域名,而你使用的邮箱不在范围内,同样会报错。可以添加需要的域名,或者清空该字段允许所有域名。检查Admin API的强制域名限制开关
在Authentication→Settings里,找到“Enforce email domain restrictions for admin API”选项。如果这个开关被开启,即使使用Service Role Key调用Admin API创建用户,也会受到域名限制。若无需此限制,直接关闭该开关即可。确认Service Role Key有效性
虽然你没修改配置,但可以检查Edge Function的环境变量SUPABASE_SERVICE_ROLE_KEY是否正确,有没有被意外替换(Service Role Key默认不会过期,除非手动重置)。
你的代码本身逻辑正确,以下是格式化后的代码:
import { serve } from "https://deno.land/std@0.168.0/http/server.ts" import { createClient } from "https://esm.sh/@supabase/supabase-js@2.45.3" const corsHeaders = { 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type', } serve(async (req) => { if (req.method === 'OPTIONS') { return new Response('ok', { headers: corsHeaders }) } try { const { email, password } = await req.json() const supabaseClient = createClient( Deno.env.get('SUPABASE_URL') ?? '', Deno.env.get('SUPABASE_SERVICE_ROLE_KEY') ?? '', { auth: { autoRefreshToken: false, persistSession: false } } ) const { data, error } = await supabaseClient.auth.admin.createUser({ email, password, email_confirm: true }) if (error) { throw error } return new Response(JSON.stringify({ user: data.user }), { 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, }) } })
内容的提问来源于stack exchange,提问作者Code on the Rocks

