You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Supabase中创建无需邮箱验证的激活用户?

解决Supabase创建无需邮箱验证的已激活用户问题

方案1:直接在控制台关闭邮箱验证要求

这是最简便的方法,修改Supabase项目的Auth配置,让用户注册后自动激活:

  • 进入你的Supabase项目控制台
  • 左侧菜单选择 Auth -> Settings
  • 找到 Email Confirmation 选项,关闭"Enable email confirmations"开关
  • 保存设置后,原来的signUp代码就能直接创建已激活用户,无需邮箱验证:
    await Supabase.instance.client.auth.signUp(email: email, password: password);
    

方案2:使用Supabase Admin API创建已激活用户

如果需要保留邮箱验证的全局设置,但部分用户无需验证,可以在服务端用Admin API创建用户(服务端密钥不能暴露在客户端):

  1. 安装Supabase Admin SDK(以Dart为例):
    flutter pub add supabase_admin
    
  2. 初始化Admin客户端并创建用户:
    import 'package:supabase_admin/supabase_admin.dart';
    
    final adminClient = SupabaseAdminClient(
      '你的项目URL',
      '你的服务端角色密钥(Service Role Key)',
    );
    
    // 创建已激活用户
    final createdUser = await adminClient.auth.admin.createUser(
      AdminUserAttributes(
        email: email,
        password: password,
        emailConfirmedAt: DateTime.now(), // 标记邮箱已验证,直接激活
      ),
    );
    

方案3:创建PostgreSQL自定义函数,客户端调用创建用户

通过自定义SQL函数绕开客户端schema限制,让客户端能间接创建已激活用户:

  1. 在Supabase控制台的 SQL Editor 中执行以下代码,创建函数:
    CREATE OR REPLACE FUNCTION public.create_activated_user(email text, password text)
    RETURNS auth.users AS $$
    DECLARE
      new_user auth.users;
    BEGIN
      -- 插入已验证的用户到auth.users表
      INSERT INTO auth.users(email, encrypted_password, email_confirmed_at)
      VALUES (email, crypt(password, gen_salt('bf')), NOW())
      RETURNING * INTO new_user;
    
      -- 同步创建邮箱身份记录(必须步骤,否则用户无法登录)
      INSERT INTO auth.identities(
        user_id, provider_id, identity_data, created_at, updated_at
      ) VALUES (
        new_user.id, 'email', json_build_object('email', email), NOW(), NOW()
      );
    
      RETURN new_user;
    END;
    $$ LANGUAGE plpgsql SECURITY DEFINER;
    
    -- 赋予客户端调用权限
    GRANT EXECUTE ON FUNCTION public.create_activated_user(text, text) TO anon;
    GRANT EXECUTE ON FUNCTION public.create_activated_user(text, text) TO authenticated;
    
  2. 客户端调用该函数创建用户:
    final result = await Supabase.instance.client.rpc(
      'create_activated_user',
      params: {'email': email, 'password': password},
    );
    

注意事项

  • 关闭邮箱验证会降低账号安全性,仅建议在内部系统、测试环境等场景使用
  • 服务端密钥(Service Role Key)绝对不能放在客户端代码中,必须部署在后端服务器
  • 自定义函数使用SECURITY DEFINER,要确保函数逻辑安全,避免被滥用

内容的提问来源于stack exchange,提问作者ddongyun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 20:30:21