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

使用supabase-go的AdminCreateUser创建用户时遇401授权错误

使用supabase-go调用AdminCreateUser接口时401权限错误

我在使用github.com/supabase-community/supabase-go包注册新用户时,调用AdminCreateUser接口持续返回401权限错误。

调用代码

session, err := r.supabaseClient.Auth.AdminCreateUser(types.AdminCreateUserRequest{
        Aud:          "",
        Role:         "authenticated",
        Email:        email,
        Phone:        "",
        Password:     &password,
        EmailConfirm: false,
        PhoneConfirm: false,
        UserMetadata: userMetadata,
        AppMetadata:  nil,
    })

返回错误

response status code 401: {"code":401,"error_code":"no_authorization","msg":"This endpoint requires a Bearer token"}

验证:curl请求可成功

我确认使用的服务密钥正确,甚至重新生成过密钥,通过curl直接请求接口可以成功创建用户:

curl -X POST \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6InF4dGVpd3BvdXRvaWl0ZXlsa2dtIiwicm9sZSI6InNlcnZpY2Vfcm9sZSIsImlhdCI6MTc0Mjc0OTczMSwiZXhwIjoyMDU4MzI1NzMxfQ.dECuiB00A07KJxHoP4ugQxfU_u5gTJUxewYmrh356ho" \
  -H "apikey: eyJhbGciOiJIUzI1NiI...sImlhdCI6MTc0Mjc0OTczMSwi..1NzMxfQ.dECuiB00A07KJxHoP4ugQxfU_u5gTJUxewYmrh356ho" \
  -d '{
    "email": "test@gmail.com",
    "password": "password"
  }' \
  "https://qxt...teylkgm.supabase.co/auth/v1/admin/users"
{"id":"089bdf18-d9d9-45e5-92b6-213e7187d356","aud":"authenticated","role":"authenticated","email"

客户端初始化方式

我用服务密钥初始化客户端,但请求失败;不过cfg.SupaBase.SupabaseKey可以正常用于已有用户的登录操作:

supaClient, err := supabase.NewClient(cfg.SupaBase.SupabaseURL, cfg.SupaBase.SupabaseServiceKey, nil)
if err != nil {
    log.Fatal(err)
}

尝试手动添加请求头也无效:

options := &supabase.ClientOptions{
    Headers: map[string]string{
        "Authorization": "Bearer " + cfg.SupaBase.SupabaseServiceKey,
        "apikey":        cfg.SupaBase.SupabaseServiceKey,
    },
}

supaClient, err := supabase.NewClient(cfg.SupaBase.SupabaseURL, cfg.SupaBase.SupabaseServiceKey, options)
if err != nil {
    log.Fatal(err)
}

测试验证请求头

我查看了supabase-go源码,确认请求头逻辑应该正确,还拉取项目代码编写测试验证:
因为options是私有属性,先添加了一个获取headers的方法:

func (c *Client) GetHeaders() map[string]string {
    return c.options.headers
}

然后编写测试:

func TestNewClientHeaders(t *testing.T) {
    client, err := supabase.NewClient(API_URL, API_KEY, nil)
    if err != nil {
        t.Fatalf("unexpected error: %v", err)
    }

    expectedHeaders := map[string]string{
        "Authorization": "Bearer " + API_KEY,
        "apikey":        API_KEY,
    }

    headers := client.GetHeaders()

    if !reflect.DeepEqual(headers, expectedHeaders) {
        t.Errorf("headers do not match, got: %v, want: %v", headers, expectedHeaders)
    }
}

测试结果显示请求头设置完全正确,但问题依然存在,求有相同经历的人提供解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 17:33:23