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. 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

セキュリティのベストプラクティス

  1. 認証情報を絶対にコミットしない:トークンは環境変数または安全なファイルに保存します
  2. クライアント操作には anon キーを使用する:公開向けの認証に使用します
  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

コメント