mcpField
S
supabase-auth

supabase-auth

github.com/nice-wolf-studio安全19317 次安装53 周前更新
代码仓库

关于 supabase-auth

supabase-auth 是通过 Supabase Auth API 处理身份验证和用户管理的技能,涵盖常见账户流程及需要 service role key 的管理操作。

主要功能

  1. 01邮箱和密码注册与登录
  2. 02会话与令牌管理
  3. 03用户元数据和账户更新
  4. 04密码恢复与邮件确认
  5. 05用户管理操作

适用场景

  1. 01为应用添加邮箱密码身份验证
  2. 02刷新或注销用户会话
  3. 03恢复账户或重发验证邮件
  4. 04使用 service role key 管理用户

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/nice-wolf-studio/claude-code-supabase-skills --skill supabase-auth

安装后在 Claude Code 中输入/supabase-auth确认已加载。

详细介绍

Supabase 身份验证

概述

此技能通过 Supabase Auth API 提供身份验证和用户管理操作。支持电子邮件/密码身份验证、会话管理、用户元数据和密码恢复。

先决条件

必需的环境变量:

export SUPABASE_URL="https://your-project.supabase.co"
export SUPABASE_KEY="your-anon-or-service-role-key"

辅助脚本: 此技能使用共享的 Supabase API 辅助脚本。请确保加载该脚本:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

常见操作

注册 - 创建新用户

使用电子邮件/密码进行基本注册:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

supabase_post "/auth/v1/signup" '{
  "email": "[email protected]",
  "password": "securepassword123"
}'

注册时附带用户元数据:

supabase_post "/auth/v1/signup" '{
  "email": "[email protected]",
  "password": "securepassword123",
  "data": {
    "first_name": "John",
    "last_name": "Doe",
    "age": 30
  }
}'

自动确认用户(需要服务角色密钥):

# Note: Use SUPABASE_KEY with service_role key for this
supabase_post "/auth/v1/signup" '{
  "email": "[email protected]",
  "password": "securepassword123",
  "email_confirm": true
}'
登录 - 验证用户身份

电子邮件/密码登录:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

response=$(supabase_post "/auth/v1/token?grant_type=password" '{
  "email": "[email protected]",
  "password": "securepassword123"
}')

# Extract access token
access_token=$(echo "$response" | jq -r '.access_token')
refresh_token=$(echo "$response" | jq -r '.refresh_token')

echo "Access Token: $access_token"
echo "Refresh Token: $refresh_token"

响应包含:

  • access_token - 用于已验证请求的 JWT 令牌
  • refresh_token - 用于在访问令牌过期时获取新访问令牌的令牌
  • user - 包含 id、电子邮件和元数据的用户对象
  • expires_in - 令牌过期时间(秒)
获取当前用户

使用访问令牌检索用户信息:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

# Set your access token from login
ACCESS_TOKEN="eyJhbGc..."

curl -s -X GET \
    "${SUPABASE_URL}/auth/v1/user" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}"
更新用户

更新用户元数据:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

ACCESS_TOKEN="eyJhbGc..."

curl -s -X PUT \
    "${SUPABASE_URL}/auth/v1/user" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
      "data": {
        "first_name": "Jane",
        "avatar_url": "https://example.com/avatar.jpg"
      }
    }'

更新电子邮件:

curl -s -X PUT \
    "${SUPABASE_URL}/auth/v1/user" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
      "email": "[email protected]"
    }'

更新密码:

curl -s -X PUT \
    "${SUPABASE_URL}/auth/v1/user" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
      "password": "newsecurepassword123"
    }'
登出

登出用户(使刷新令牌失效):

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

ACCESS_TOKEN="eyJhbGc..."

curl -s -X POST \
    "${SUPABASE_URL}/auth/v1/logout" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${ACCESS_TOKEN}"
刷新令牌

使用刷新令牌获取新的访问令牌:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

REFRESH_TOKEN="your-refresh-token"

supabase_post "/auth/v1/token?grant_type=refresh_token" '{
  "refresh_token": "'"${REFRESH_TOKEN}"'"
}'
密码恢复

发送密码重置电子邮件:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

supabase_post "/auth/v1/recover" '{
  "email": "[email protected]"
}'

使用恢复令牌重置密码:

# This is typically done through email link
# The recovery token comes from the email link

RECOVERY_TOKEN="token-from-email"

curl -s -X PUT \
    "${SUPABASE_URL}/auth/v1/user" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${RECOVERY_TOKEN}" \
    -H "Content-Type: application/json" \
    -d '{
      "password": "newpassword123"
    }'
重新发送确认电子邮件

重新发送电子邮件验证邮件:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

supabase_post "/auth/v1/resend" '{
  "type": "signup",
  "email": "[email protected]"
}'

管理员操作(需要服务角色密钥)

列出所有用户

获取所有用户(需要服务角色密钥):

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

# Make sure SUPABASE_KEY is set to service_role key
supabase_get "/auth/v1/admin/users"

分页获取用户列表:

# Get users with pagination
supabase_get "/auth/v1/admin/users?page=1&per_page=50"
按 ID 获取用户

检索指定用户(需要服务角色密钥):

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

USER_ID="user-uuid-here"

supabase_get "/auth/v1/admin/users/${USER_ID}"
创建用户(管理员)

创建用户且不进行电子邮件确认:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

supabase_post "/auth/v1/admin/users" '{
  "email": "[email protected]",
  "password": "securepassword123",
  "email_confirm": true,
  "user_metadata": {
    "first_name": "Admin",
    "last_name": "Created"
  }
}'
更新用户(管理员)

以管理员身份更新用户:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

USER_ID="user-uuid-here"

curl -s -X PUT \
    "${SUPABASE_URL}/auth/v1/admin/users/${USER_ID}" \
    -H "apikey: ${SUPABASE_KEY}" \
    -H "Authorization: Bearer ${SUPABASE_KEY}" \
    -H "Content-Type: application/json" \
    -d '{
      "email": "[email protected]",
      "user_metadata": {
        "role": "admin"
      }
    }'
删除用户(管理员)

删除用户账户:

source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

USER_ID="user-uuid-here"

supabase_delete "/auth/v1/admin/users/${USER_ID}"

常见模式

登录并存储令牌
#!/bin/bash
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

# Login
response=$(supabase_post "/auth/v1/token?grant_type=password" '{
  "email": "[email protected]",
  "password": "password123"
}')

# Extract tokens
access_token=$(echo "$response" | jq -r '.access_token')
refresh_token=$(echo "$response" | jq -r '.refresh_token')
user_id=$(echo "$response" | jq -r '.user.id')

# Store in environment or file for subsequent requests
export SUPABASE_ACCESS_TOKEN="$access_token"
export SUPABASE_REFRESH_TOKEN="$refresh_token"
export SUPABASE_USER_ID="$user_id"

echo "Logged in as user: $user_id"
检查用户是否存在
source "$(dirname "${BASH_SOURCE[0]}")/../../scripts/supabase-api.sh"

# Note: This requires service role key and admin endpoint
email="[email protected]"

users=$(supabase_get "/auth/v1/admin/users")
exists=$(echo "$users" | jq --arg email "$email" '.users[] | select(.email == $email)')

if [[ -n "$exists" ]]; then
    echo "User exists"
else
    echo "User does not exist"
fi
验证 JWT 令牌
# Tokens are JWTs - you can decode them (requires jq)
ACCESS_TOKEN="eyJhbGc..."

# Decode payload (base64)
payload=$(echo "$ACCESS_TOKEN" | cut -d. -f2 | base64 -d 2>/dev/null)
echo "$payload" | jq '.'

# Check expiration
exp=$(echo "$payload" | jq -r '.exp')
now=$(date +%s)

if [[ $now -gt $exp ]]; then
    echo "Token expired"
else
    echo "Token valid"
fi

错误处理

常见错误响应:

状态码错误含义
400登录凭据无效电子邮件或密码错误
400用户已注册电子邮件已存在
401令牌无效访问令牌已过期或无效
422验证错误电子邮件格式无效或密码强度不足
429请求过多超出速率限制
if response=$(supabase_post "/auth/v1/token?grant_type=password" '{...}' 2>&1); then
    echo "Login successful"
    access_token=$(echo "$response" | jq -r '.access_token')
else
    echo "Login failed: $response"
    exit 1
fi

安全最佳实践

  1. 切勿提交凭据:将令牌存储在环境变量或安全文件中
  2. 客户端操作使用 anon key:用于面向公众的身份验证
  3. 谨慎使用服务角色密钥:仅用于管理员操作,切勿向客户端公开
  4. 实现令牌刷新:在访问令牌过期前刷新
  5. 启用 RLS:在 Supabase 控制台中配置行级安全策略
  6. 在服务端验证令牌:未经验证,不要信任客户端提供的令牌

会话管理

典型流程:

  1. 用户登录 → 获取 access_token 和 refresh_token
  2. 安全存储令牌
  3. 在已验证请求的 Authorization 标头中使用 access_token
  4. access_token 过期时 → 使用 refresh_token 获取新的 access_token
  5. 用户登出 → 使 refresh_token 失效

令牌有效期:

  • 访问令牌:1 小时(默认)
  • 刷新令牌:30 天(默认)

API 文档

完整的 Supabase Auth API 文档:https://supabase.com/docs/guides/auth

评论

支持 Markdown