概念とテナントモデル#

この文書では、統合に必要なテナント階層、Client、Environment、ドメイン、session、MAU の関係を説明する。

テナント階層#

Workspace
└── Project
    ├── Test Environment
    │   └── Client
    └── Production Environment
        └── Client
概念 用途
Workspace 課金、管理メンバー、RBAC の単位。MAU 無料枠も Workspace 単位で適用する。
Project 1 つのアプリケーションまたはサービスを表し、表示名とブランドをまとめる。
Environment User pool の分離単位。User、Session、Passkey、Social connection、Client、署名鍵、Webhook secret、RP ID を Test と Production の間で共有しない。
Client OIDC の relying party を表す。redirect URI、post-logout redirect URI、Allowed Origins、許可 scope / resource、Client 認証方式を持つ。PKCE S256 は全 Client で必須である。

Management API の GET /v1/environments/{environmentId} は type、status、issuer、interaction_domain、rp_id を返す。統合に必要な Canonical Issuer と Interaction Domain はこの response から取得する。GET /v1/clients?environment_id=... は client_type、token_endpoint_auth_method、redirect_uris などを返す。

Client type と token endpoint 認証#

client_type token_endpoint_auth_method PKCE 用途
web_bff client_secret_basic または client_secret_post S256 必須 Server-side Web アプリ。Client secret はサーバーだけで保持する。
web_spa none S256 必須 ブラウザーで動く Public Client。Client secret は発行されない。
react_native none S256 必須 Native Public Client。Client secret は発行されない。

Authorization Server は require_pkce の値にかかわらず、全 Client に PKCE S256 を要求する。

対応する grant は Authorization Code と Refresh Token である。client_credentials、machine-to-machine Client type、Implicit、Resource Owner Password Credentials は提供しない。

ID prefix#

Resource ID は prefix と暗号学的乱数からなり、連番や email address 由来ではない。ID body は 20 byte の乱数を 32 文字の base32url で表現する。

Prefix Resource
wsp_ Workspace
prj_ Project
env_ Environment
cli_ Client
usr_ End User
ses_ Session
psk_ Passkey
txn_ Authentication transaction
rtf_ Refresh token family
whk_ Webhook
evt_ Event
key_ Signing key
mky_ Management API key
idn_ Social identity
con_ Social connection
dom_ Custom Domain
job_ User import/export job
dlv_ Webhook delivery

Resource ID は opaque 値として扱い、prefix 以外から内部状態を推測しない。req_ は request ID であり、resource ID ではない。

Test と Production#

Environment.type は test または production である。別 Environment には別の User pool があり、Test から Production へ User、Session、Passkey、Social connection、Client、署名鍵、Webhook secret、RP ID をコピーしない。Environment の issuer は生成後に変更しない。

Management API は Workspace、Project、Environment、Client などを管理する API である。Management API key は Bearer 認証に使い、発行時に Workspace と scope が固定される。secret は sk_live_ で始まる。これは Management API key の prefix であり、Client ID や OIDC Client secret とは異なる。Test Environment 用にも sk_live_ で発行されるため、prefix から Environment の type を推測してはならない。

Issuer、Interaction Domain、Custom Domain#

OIDC の Canonical Issuer (https://id.zeroword.smartcrab.ai/e/<environmentId>) は Environment 固有で変更しない。Production の形式は次のとおりである。

https://id.zeroword.smartcrab.ai/e/<environmentId>

Hosted Login は Zeroword の認証画面であり、Interaction Domain は Hosted Login、Public Authentication API、association files を提供する host である。既定値の Default Interaction Domain は env-<environmentId の env_ 以降>.login.zeroword.smartcrab.ai であり、OIDC metadata の issuer は引き続き Canonical Issuer を示す。

Public Authentication API は Hosted Login を使わずに独自の認証 UI を構築するための API であり、Interaction Domain または Canonical Issuer alias の /v1 path から利用する。

rp_enabled が有効な active Custom Domain があれば、その hostname が Interaction Domain と RP ID の両方になる。Custom Domain の切り替え時に Canonical Issuer は変わらない。Authorization Server から Hosted Login への移動は署名済みの短命・一回限り transaction に基づく。

RP ID は Passkey credential が束縛される WebAuthn hostname である。Production で Custom Domain を使う場合は、最初の Passkey 登録前に Custom Domain の設定を完了させる。RP ID を後から変更すると、旧 RP での再認証と新 RP での Passkey 登録を含む移行が必要になる。

Session と token#

Hosted Login / 認証操作用の Login Session と、顧客 API 用の OIDC token は別の仕組みである。

Credential 用途 TTL
Hosted Login session cookie Hosted Login と認証操作 idle 7日、absolute 30日
Authorization code Token endpoint で一度だけ交換 60秒
Access token 顧客 API 5分
ID token Client が認証結果を確認 5分
Refresh token Access token の更新 idle 30日、absolute 90日

Web BFF の @auth-platform/server は refresh token を暗号化した HttpOnly session cookie 内に保持し、アプリケーションへ公開する session view からは refresh token と raw ID token を除外する。Access token は最大 5 分で自然失効する。個別 session は失効でき、全 session の無効化は user の security version を更新する。即時の失効判定が必要な Resource Server は introspection endpoint を使う。

MAU と課金の基本#

1 MAU は、Production Environment で請求月中に初めて成功した一意の End User である。対象は interactive login または refresh token exchange である。Test Environment、失敗ログイン、UserInfo、JWKS 取得、Access token 検証、管理メンバー、Management API key、Webhook は数えない。

集計の単位は Workspace / Environment / 請求月 / User ID である。同じ Environment の Web と React Native が同じ User ID を使えば 1 MAU、Environment が異なれば別々に数える。

  • Workspace ごとに月 30,000 MAU までは無料で、カード登録を必要としない。
  • 無料枠の 80%、95%、100% 到達時に Owner / Billing role へ通知する。
  • 30,000 MAU を超えて使うには Stripe Customer、Subscription、Payment Method を有効にする。
  • 未課金 Workspace の MAU が 30,000 を超えた場合、既存ユーザーの login は継続する。72 時間の grace period 後も課金設定がなければ、新規ユーザー作成だけが停止する。
  • 課金開始時は当月 ledger を Stripe へ backfill する。Stripe 障害は認証 hot path を止めない。