spacetimedb-auth について
spacetimedb-authは、SpacetimeDBモジュールのID、クレーム、アクセス制御、認可ポリシーを扱うスキルです。接続拒否、クレーム検証、reducerのチェック、実験的なRLSを案内します。
主な機能
- 01IDとJWTクレームの指針
- 02未認証接続の拒否
- 03発行者とオーディエンスの検証
- 04reducerでの認可チェック
- 05実験的なRLSの指針
- 06認証リファレンスマップ
活用シーン
- 01認証付きSpacetimeDBモジュールの設計
- 02認可前のJWTクレーム検証
- 03未認証クライアントの拒否
- 04行レベルの可視性ルールの適用
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ danmossa/ spacetimedb-skills --skill spacetimedb-authインストール後、Claude Code で/spacetimedb-authを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/core-concepts-authentication-auth0.mdcore-concepts-authentication-clerk.mdcore-concepts-authentication-spacetimeauth-configuring-a-project.mdcore-concepts-authentication-spacetimeauth-creating-a-project.mdcore-concepts-authentication-spacetimeauth-react-integration.mdcore-concepts-authentication-spacetimeauth-testing.mdcore-concepts-authentication-spacetimeauth.mdcore-concepts-authentication-usage.mdcore-concepts-authentication.mdhow-to-reject-client-connections.mdhow-to-rls.md詳細
本人確認、クレーム、アクセス制御、認可ポリシーには、このスキルを使用します。
認証の基本パターン
- SpacetimeDB は、JWT の
subクレームとissクレームからIdentityを導出します。安定した所有権の確認には ID を使用し、プロバイダー、オーディエンス、ロール、ポリシーの判断には JWT クレームを使用します。 - 認証が必要なモジュールでは、クライアントがサブスクライブしたりリデューサーを呼び出したりする前に、
client_connected/clientConnectedで未認証のクライアントを拒否します。 - 件名やカスタムクレームを信頼する前に、必ず発行者とオーディエンスを検証します。クレーム名と期待値はデプロイ環境によって異なります。
- JWT の詳細情報を取得するには、クライアントが指定した ID だけに頼らず、
senderAuth/SenderAuth/sender_auth()を使用します。 - 認可チェックにはリデューサー内でロールやカスタムクレームのヘルパーを使用し、想定される拒否については送信者にエラーを返します。
- RLS は実験的な機能です。ルールは SQL フィルターであり、呼び出し元の ID には
:senderを使用し、1 つのテーブルから完全な行を返します。同じテーブルに複数のルールがある場合、ルールは OR で結合されます。モジュールの所有者には RLS が適用されません。
TypeScript で接続を拒否するパターン:
import { SenderError } from "spacetimedb/server";
const OIDC_CLIENT_IDS = ["client_..."];
export const onConnect = spacetimedb.clientConnected((ctx) => {
const jwt = ctx.senderAuth.jwt;
if (jwt == null) throw new SenderError("Unauthorized: JWT is required");
if (jwt.issuer !== "https://auth.spacetimedb.com/oidc") {
throw new SenderError("Unauthorized: invalid issuer");
}
if (!jwt.audience.some((aud) => OIDC_CLIENT_IDS.includes(aud))) {
throw new SenderError("Unauthorized: invalid audience");
}
});
リファレンスマップ
| 必要な情報 | 参照先 |
|---|---|
| 認証の概要 | references/core-concepts-authentication.md |
| SpacetimeAuth | references/core-concepts-authentication-spacetimeauth*.md |
| サードパーティプロバイダー | references/core-concepts-authentication-auth0.md、references/core-concepts-authentication-clerk.md |
| モジュールコード内のクレーム | references/core-concepts-authentication-usage.md |
| 行レベルセキュリティと接続拒否 | references/how-to-rls.md、references/how-to-reject-client-connections.md |
ガイダンス
- 認証における ID のチェックは、テーブルの可視性や行レベルの認可に関する判断と分けて扱います。
- クレーム名、発行者、オーディエンスはデプロイ環境によって異なるものとして扱います。ユーザーのプロジェクトですでに使用されている場合を除き、サンプル値をハードコードしないでください。
- エンドポイントレベルのタスクでは、HTTP トークンの仕組みについて spacetimedb-http を参照してください。
コメント
Markdown 対応