mcpField
S
spacetimedb-auth

spacetimedb-auth

github.com/danmossaセキュリティ2164 回インストール19 週間前に更新
リポジトリ

spacetimedb-auth について

spacetimedb-authは、SpacetimeDBモジュールのID、クレーム、アクセス制御、認可ポリシーを扱うスキルです。接続拒否、クレーム検証、reducerのチェック、実験的なRLSを案内します。

主な機能

  1. 01IDとJWTクレームの指針
  2. 02未認証接続の拒否
  3. 03発行者とオーディエンスの検証
  4. 04reducerでの認可チェック
  5. 05実験的なRLSの指針
  6. 06認証リファレンスマップ

活用シーン

  1. 01認証付きSpacetimeDBモジュールの設計
  2. 02認可前のJWTクレーム検証
  3. 03未認証クライアントの拒否
  4. 04行レベルの可視性ルールの適用

インストール

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

$npx skills add https://github.com/danmossa/spacetimedb-skills --skill spacetimedb-auth

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

同梱ファイル

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

references/
core-concepts-authentication-auth0.md
core-concepts-authentication-clerk.md
core-concepts-authentication-spacetimeauth-configuring-a-project.md
core-concepts-authentication-spacetimeauth-creating-a-project.md
core-concepts-authentication-spacetimeauth-react-integration.md
core-concepts-authentication-spacetimeauth-testing.md
core-concepts-authentication-spacetimeauth.md
core-concepts-authentication-usage.md
core-concepts-authentication.md
how-to-reject-client-connections.md
how-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
SpacetimeAuthreferences/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 を参照してください。

コメント