テーマ
認証 / 認可
認証基盤
Better Auth を採用する。
| 項目 | 採用 |
|---|---|
| 永続化 | D1 (Drizzleアダプタ) |
| セッションストア | Cookie + DB セッション。短期キャッシュは KV を併用(任意) |
| サインイン手段 | Email + Password (MVP)。OAuth(Google等) は後続で追加検討 |
| メール送信 | 招待 / リセット用。プロバイダ未確定(Resend / Mailgun 等) |
| MFA | TOTP を MVP に含める(OWNER / ADMIN は必須)。詳細はセキュリティ参照 |
| パスワードポリシー | 12文字以上、3種以上の文字種。詳細はセキュリティ参照 |
| ロックアウト | 5回連続失敗で15分ロック |
ロールと配置
ADMINロールは テナントに所属しない ユーザー。/admin/*のみ操作。OWNER/MEMBERは 必ず1つのテナントに所属する。- 1ユーザーが複数テナントに属すケースはMVPでは作らない(招待時に別アカウント扱い)。
テナント解決
- middleware で
c.set('tenantId', ...)のように Hono コンテキストへ注入。 - DBラッパも
tenantId必須の関数シグネチャにし、書き忘れを型で防ぐ。
ルート分離
| パス | 必要ロール |
|---|---|
/ | OWNER または MEMBER |
/admin/* | ADMIN のみ |
/api/v1/* | OWNER / MEMBER(自テナントのみ) |
/api/admin/* | ADMIN のみ |
/api/webhooks/* | 認証なし、署名検証で防御 |
/auth/* | パブリック |
認可マトリクス(暫定)
| 操作 | OWNER | MEMBER | ADMIN |
|---|---|---|---|
| テナント設定変更 | ✅ | ❌ | ✅ |
| メンバー招待 / ロール変更 | ✅ | ❌ | ✅ |
| 顧客 CRUD | ✅ | ✅ | 参照のみ |
| 契約 CRUD | ✅ | ✅ | 参照のみ |
| LINE チャネル接続 | ✅ | ❌ | ❌ |
| 課金プラン変更 | ✅ | ❌ | ✅ |
| 全テナント一覧 | ❌ | ❌ | ✅ |
| 決済プロバイダ設定 | ❌ | ❌ | ✅ |
| 監査ログ閲覧 | ✅(自テナント) | ❌ | ✅(全テナント) |
仕様側の権限マトリクス(roles)と整合。実装上は Hono middleware として
requireRole('OWNER')/requireAdmin()を提供する。
初期セットアップウィザード(ADMIN作成)
system_state.setup_completedフラグ(KV or テーブル)で再表示を防ぐ。- ウィザードへのアクセスは IP 制限 / セットアップトークンの検討。
サインアップ / 招待フロー
セッション
- Better Auth のCookieベース。
HttpOnly/Secure/SameSite=Lax。 - Workers の Cookie 取扱いは Hono ミドルウェアで統一。
- ログアウトは
auth.signOut()でセッションテーブルからレコード削除。
設計上の注意
- テナント越境の防止: ADMIN以外は他テナントのリソースに触れない。middleware 1段では信頼せず、サービス層でも
tenantId比較を入れる二重防御。 - ロール昇格の監査: ロール変更は必ず監査ログへ。
- ADMIN権限の最小化: ADMINでも顧客本文(個人情報)の参照は最小限にし、必要時のみ理由ログ付きでアクセスする運用を設計する。
関連
- セキュリティ — 暗号化、MFA、監査、PII マスキングの全体方針