mcpField
S
supabase-auth-storage-realtime-core

supabase-auth-storage-realtime-core

github.com/jeremylongshore開発2.9k38 回インストール2 日前に更新
リポジトリ

supabase-auth-storage-realtime-core について

Supabase アプリ開発向けのスキルで、認証、ファイルストレージ、リアルタイム機能を扱います。RLS によるユーザーデータのアクセス制御も説明します。

主な機能

  1. 01登録、ログイン、OAuth の実装
  2. 02ファイルのアップロードと署名付き URL
  3. 03データベース変更の購読
  4. 04ブロードキャストとプレゼンス機能

活用シーン

  1. 01アプリへのユーザー認証の追加
  2. 02ユーザーファイルの安全な保存と共有
  3. 03メッセージやプロフィールの更新受信

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/jeremylongshore/tons-of-skills-marketplace --skill supabase-auth-storage-realtime-core

インストール後、Claude Code で/supabase-auth-storage-realtime-coreを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
auth.md
examples.md
python-examples.md
realtime.md
storage.md

詳細

Supabase Auth + Storage + Realtime Core

概要

Supabase データベースを完全なアプリケーションバックエンドにする3つの柱、すなわちユーザー認証(メールアドレス/パスワード、OAuth、マジックリンク、セッションのライフサイクル)、ファイルストレージ(アップロード、ダウンロード、署名付き URL、バケットレベルの RLS ポリシー)、リアルタイムサブスクリプション(Postgres の変更イベント、クライアント間ブロードキャスト、プレゼンス追跡)を実装します。すべての操作は auth.uid() を通じて Row-Level Security と連携します。

以下の各柱について、このファイルには簡潔な骨組みを記載しています。詳しいコピー&ペースト形式の手順は references/ にまとめているため、このファイルをざっと確認しやすい状態に保てます。

前提条件

  • supabase.com/dashboard で Supabase プロジェクトを作成していること
  • @supabase/supabase-js v2 をインストールしていること(npm install @supabase/supabase-js)
  • プロジェクトの Settings > API で SUPABASE_URL と SUPABASE_ANON_KEY を確認できること
  • Python の場合:pip install supabase(postgrest-py、gotrue-py、storage3、realtime-py をラップします)

手順

ファイルを読み込み(Read)、クライアントとルート/コンポーネントのコードを編集または作成(Write、Edit)し、新しいクライアントを作成する前にプロジェクトを検索(Grep)して、既存の Supabase クライアントを再利用してください。SDK のインストールには Bash(npm:*) を、マイグレーション/ポリシーの実行には Bash(supabase:*) を使用してください。

ステップ 1:Auth — 登録、ログイン、OAuth

まずクライアントを一度だけ初期化し、アプリで必要なフローを組み込みます。基本形:

import { createClient } from '@supabase/supabase-js'

const supabase = createClient(process.env.SUPABASE_URL!, process.env.SUPABASE_ANON_KEY!)

// Email/password
await supabase.auth.signUp({ email, password })
await supabase.auth.signInWithPassword({ email, password })

// OAuth — redirect the user to data.url
const { data } = await supabase.auth.signInWithOAuth({ provider: 'google' })

// React to session changes (SIGNED_IN / SIGNED_OUT / TOKEN_REFRESHED)
supabase.auth.onAuthStateChange((event, session) => { /* update UI */ })

Auth の詳しい手順 — OAuth コールバック、マジックリンク、セッションのライフサイクル、パスワードのリセット:references/auth.md。Python:references/python-examples.md。

ステップ 2:Storage — アップロード、ダウンロード、バケットポリシーによる保護

パブリックバケットは CDN URL で配信し、プライベートバケットでは署名付き URL が必要です。基本形:

// Upload to the signed-in user's own folder (RLS enforces ownership)
await supabase.storage.from('avatars').upload(`${userId}/avatar.png`, file, { upsert: true })

// Public URL (public bucket) vs. time-limited signed URL (private bucket)
supabase.storage.from('avatars').getPublicUrl(`${userId}/avatar.png`)
await supabase.storage.from('documents').createSignedUrl('reports/q4.pdf', 3600)

Storage の詳しい手順 — ダウンロード、一覧表示、削除、およびユーザーごとのアクセスを適用するバケット RLS ポリシー:references/storage.md。Python:references/python-examples.md。

ステップ 3:Realtime — Postgres の変更、ブロードキャスト、プレゼンス

チャネルは3種類あります。データベース変更のリスナー、クライアント間ブロードキャスト、プレゼンスです。基本形:

const channel = supabase
  .channel('chat-room')
  .on('postgres_changes',
    { event: 'INSERT', schema: 'public', table: 'messages' },
    (payload) => console.log('New:', payload.new))
  .subscribe()
// One-time table setup: ALTER PUBLICATION supabase_realtime ADD TABLE messages;
supabase.removeChannel(channel)  // clean up

Realtime の詳しい手順 — UPDATE/DELETE フィルター、RLS の適用範囲に応じたサブスクリプション、ブロードキャスト、プレゼンス追跡:references/realtime.md。Python:references/python-examples.md。

出力

  • Auth:ユーザー登録、パスワードログイン、OAuth フロー(Google/GitHub)、マジックリンク、onAuthStateChange によるセッションのライフサイクル、パスワードのリセット
  • Storage:ファイルのアップロード/ダウンロード、CDN 配信アセット用のパブリック URL、プライベートファイル用の有効期限付き署名付き URL、auth.uid() と storage.foldername() を使用したバケットレベルの RLS ポリシー
  • Realtime:サーバー側フィルターを使用した Postgres 変更サブスクリプション、クライアント間メッセージ用のブロードキャストチャネル、オンライン状態のプレゼンス追跡

エラー処理

エラー原因解決策
AuthApiError: User already registeredメールアドレスが重複して登録されていますsignInWithPassword を使用するか、事前に登録済みか確認します
AuthApiError: Invalid login credentialsメールアドレスまたはパスワードが正しくありません認証情報を確認し、メールアドレスの確認状況も確認します
AuthApiError: Email not confirmedユーザーが確認リンクをクリックしていませんresend({ type: 'signup', email }) で再送します
StorageApiError: Bucket not foundバケットが存在しませんダッシュボードまたは INSERT INTO storage.buckets で作成します
StorageApiError: new row violates row-level securityRLS ポリシーによって操作がブロックされていますstorage.objects のポリシーがユーザーとバケットに一致することを確認します
StorageApiError: The resource already existsファイルが存在し、upsert: false になっています上書きするには upsert: true を設定するか、一意のパスを使用します
Realtime: channel error または TIMED_OUTネットワークの問題、または Realtime が有効になっていません対象テーブルに対する ALTER PUBLICATION supabase_realtime ADD TABLE を確認します
Realtime: too many channels同時チャンネル数の上限を超えていますremoveChannel() で使用していないチャンネルの購読を解除します

例

サインインし、RLS で保護されたユーザーフォルダーにアバターをアップロードして公開 URL を取得し、プロフィールのライブ更新を購読する一連の流れは、references/examples.md に記載されています。各ステップでは、上記の 3 つの基本例を組み合わせており、新しい API は使用していません。

リソース

次のステップ

Supabase の一般的なエラーとデバッグについては、supabase-common-errors を参照してください。 データベースのクエリと CRUD 操作については、supabase-crud-core を参照してください。

コメント