Skip to content

list-sessions レスポンスからセッショントークンを除外する - #278

Merged
hirokisakabe merged 2 commits into
mainfrom
fix/list-sessions-token-262
Aug 12, 2026
Merged

list-sessions レスポンスからセッショントークンを除外する#278
hirokisakabe merged 2 commits into
mainfrom
fix/list-sessions-token-262

Conversation

@hirokisakabe

Copy link
Copy Markdown
Owner

close #262

目的

Better Auth の GET /api/auth/list-sessions が返す各 session を非機密フィールドの allowlist に変換し、Bearer 認証へ再利用できる session token をブラウザ JavaScript から取得できないようにします。

変更内容

  • apps/api/src/auth.ts
    • Better Auth の after hook で /list-sessions の成功レスポンスを allowlist 化
    • iduserId、日時、IP address、user agent を維持し、token を除外
    • 変換後レスポンスへ Cache-Control: private, no-store を設定
  • apps/api/src/auth.test.ts
    • Cookie 認証・Bearer 認証の双方で token が含まれず、非機密フィールドが維持されることを検証
    • 未認証アクセスが引き続き 401 になることを検証

制約

この対応は Better Auth 標準 endpoint の after hook で実行時レスポンス本文を変換します。そのため、Better Auth が生成する listSessions の推論型および OpenAPI 契約は標準仕様のままで、token 必須として表現される実行時レスポンスとの不一致が残ります。

issue の第一方針である plugin hook による標準 endpoint の allowlist 化に沿い、Web は現在この API を利用しておらず、受け入れ条件は実行時の認証情報除外を対象としているため、本 PR では型/OpenAPI 契約の追加変更を見送ります。将来 Web 等から型付きで利用する場合は、専用 endpoint または契約の明示的な上書きを検討する必要があります。

影響範囲

  • apps/api
  • Web の Cookie 認証と Mobile / CLI の Bearer 認証方式・トークン発行経路は変更しません

ローカル検証

  • pnpm --filter @tascal/api exec vitest run src/auth.test.ts
  • pnpm lint
  • pnpm format:check
  • pnpm typecheck
  • pnpm test

すべて成功済みです。

レビュー

親セッションで cross-review 済みです(critical 0 / warning 1 / info 1)。warning は上記の型/OpenAPI 契約との不一致として制約に記載し、info の未認証 401 テストは追加 commit で対応しました。

@github-actions

Copy link
Copy Markdown

🚀 プレビュー環境がデプロイされました!

URL: https://tascal-pr-278-197260822086.asia-northeast1.run.app

@hirokisakabe
hirokisakabe merged commit ce82bb1 into main Aug 12, 2026
8 checks passed
@hirokisakabe
hirokisakabe deleted the fix/list-sessions-token-262 branch August 12, 2026 03:48
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

list-sessions レスポンスから再利用可能なセッショントークンを除外する

1 participant