supabase-auth について
supabase-authは、Supabase Auth APIで認証とユーザー管理を行うスキルです。一般的なアカウント操作に加え、service role keyが必要な管理操作も扱います。
主な機能
- 01メールアドレスとパスワードでの登録・ログイン
- 02セッションとトークンの管理
- 03ユーザーメタデータとアカウントの更新
- 04パスワード再設定とメール確認
- 05ユーザーの管理操作
活用シーン
- 01アプリにメールアドレスとパスワード認証を追加
- 02ユーザーセッションの更新や無効化
- 03アカウントの復旧や確認メールの再送
- 04service 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 キーを使用する:公開向けの認証に使用します
- サービスロールキーは慎重に使用する:管理者操作のみに使用し、クライアントには絶対に公開しません
- トークンの更新を実装する:アクセストークンの有効期限が切れる前に更新します
- 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