关于 supabase-auth
supabase-auth 是通过 Supabase Auth API 处理身份验证和用户管理的技能,涵盖常见账户流程及需要 service role key 的管理操作。
主要功能
- 01邮箱和密码注册与登录
- 02会话与令牌管理
- 03用户元数据和账户更新
- 04密码恢复与邮件确认
- 05用户管理操作
适用场景
- 01为应用添加邮箱密码身份验证
- 02刷新或注销用户会话
- 03恢复账户或重发验证邮件
- 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
安全最佳实践
- 切勿提交凭据:将令牌存储在环境变量或安全文件中
- 客户端操作使用 anon key:用于面向公众的身份验证
- 谨慎使用服务角色密钥:仅用于管理员操作,切勿向客户端公开
- 实现令牌刷新:在访问令牌过期前刷新
- 启用 RLS:在 Supabase 控制台中配置行级安全策略
- 在服务端验证令牌:未经验证,不要信任客户端提供的令牌
会话管理
典型流程:
- 用户登录 → 获取 access_token 和 refresh_token
- 安全存储令牌
- 在已验证请求的 Authorization 标头中使用 access_token
- access_token 过期时 → 使用 refresh_token 获取新的 access_token
- 用户登出 → 使 refresh_token 失效
令牌有效期:
- 访问令牌:1 小时(默认)
- 刷新令牌:30 天(默认)
API 文档
完整的 Supabase Auth API 文档:https://supabase.com/docs/guides/auth
评论
支持 Markdown