06 認証仕様
6.1 ログインフロー
【通常】
有効なセッションあり → そのまま利用
有効なセッションなし
↓
Discord OAuth(基本)
├── 成功 → セッション発行・Discord 情報自動同期
│ パスキー未登録なら「おすすめ」表示
└── 失敗・使えない
↓
緊急ログイン
メールアドレス + ユーザー名
+ パスキー
or デバイスフィンガープリント
or 管理者発行の一時キー
6.2 緊急ログインのルール
- 照合単位は Discord アカウント単位
- メール・ユーザー名・認証手段がすべて同じ Discord アカウントに紐付いていること
- 異なる Discord アカウントの組み合わせは不可(同じメンバーでも)
is_primaryは持たない・全 Discord アカウントをフラットに扱う
6.3 一時キー(緊急ログイン)フロー
メンバーが WebUI で要請
↓ POST /api/v1/auth/emergency/request
member_emergency_keys に status=pending で作成
↓
管理者の Discord DM へ通知
↓ POST /api/v1/auth/emergency/issue/:id(管理者)
key_hash 生成・status=issued
↓
管理者がシステム外でメンバーへキーを伝達
↓ POST /api/v1/auth/emergency/verify
used_at 記録・status=used・キー無効化
- 有効期限:発行から 1 時間
- 使用回数:1 回限り
6.4 ログイン通知
Discord DM 宛に通知する。
通知内容: - OS・ブラウザ名 - 日時 - ログイン方法(session / oauth / passkey / totp / emergency_key) - 新規端末フラグ
通知タイミングは Discord アカウント単位でユーザーが設定可能(詳細は 11_notification.md 参照)。
6.5 完全削除フロー
- WebUI からのみ実行可能
- 管理者が削除済み一覧の深い階層の UI から操作
- パスキー または TOTP で本人確認
- 確認専用トークン発行(有効期限 5 分・1 操作限り)
- 実行後
permanent_delete_logsに削除前スナップショットを保存
管理者が完全削除 UI にアクセス
↓ POST /api/v1/auth/permanent-delete-token
パスキー or TOTP で本人確認
↓
確認用トークン発行(有効期限 5 分・1 操作限り)
↓ DELETE /api/v1/.../permanent (トークン付き)
permanent_delete_logs にスナップショット保存
↓
対象レコードを物理削除
6.6 デバイスフィンガープリント
- FingerprintJS(詳細モード)を使用
- フィンガープリントデータは
member_devicesに保存 - 緊急ログイン時の認証手段の一つとして使用
- ログイン履歴の
is_new_deviceフラグ判定にも使用
6.7 セッション管理
- 複数端末の同時ログインを許可
- セッションは
member_sessionsで管理 - FK は
discord_account_id(Discord アカウント単位) - セッション更新:
POST /api/v1/auth/session/refresh