セッションローテーション実装 (Invalid token対策)#18
Conversation
- refreshAuthToken関数を追加 (/api/v2/auth/refresh) - User にリフレッシュトークンを保持し、自動リフレッシュ機構を追加 - uploadFile/createThread で Invalid token 時に自動リトライ - WebSocket再接続失敗時にもトークンリフレッシュを試行 closes #15
|
@claude はよレビューしろ |
|
Claude finished @EdamAme-x's task in 59s —— View job コードレビュー
全体的にロジックは正しく、意図が明確なPRです。ただし以下の点が気になります。 🔴 バグ:
|
| 重要度 | 項目 |
|---|---|
| 🔴 | なし(致命的バグなし) |
| 🟡 | 並行リフレッシュのレース条件 |
| 🟡 | accessToken の可視性 |
| 🟡 | WebSocket onclose の無条件リフレッシュ |
機能としては問題なく動作するはずで、マージ可能なレベルです。上記の🟡を対処すると品質が上がります。
- accessTokenをprivate fieldにしgetterで公開 (外部からの書き換え防止) - refresh()を並行呼び出し時にdedup (#refreshPromise) - Thread: #disposed + #pendingRejectでcancel時にawait中のPromiseを解放 - Thread: 旧WSのハンドラを再接続時にクリーンアップ - Thread: onmessageもエラー/キャンセルパスでnull化 - WS onclose refreshにNOTEコメント追加
|
@claude 再レビューしろ |
|
Claude finished @EdamAme-x's task in 52s —— View job 再レビュー
前回の指摘事項との照合結果です。 前回指摘の対応状況
✅ 対応済みrefresh dedup (
async refresh(): Promise<void> {
if (this.#refreshPromise) return this.#refreshPromise
this.#refreshPromise = this.#doRefresh()
try {
await this.#refreshPromise
} finally {
this.#refreshPromise = null
}
}並行して
#accessToken: string
get accessToken(): string {
return this.#accessToken
}外部からの書き換えを防ぎつつ読み取りはできる設計になっています。✅ 🟡 残存:
|
|
@akku1139 review please |
akku1139
left a comment
There was a problem hiding this comment.
expires ヘッダーに基づいてリフレッシュ用のPromiseを用意しとくのが多分望ましい
|
後で見ます |
- fetchAnonymousToken/refreshAuthToken が expires レスポンスヘッダーを解析して expiresAt を返すように変更 - User に #scheduleRefresh を追加: 有効期限5分前に自動リフレッシュをスケジュール - #doRefresh の catch で匿名トークン再取得するフォールバックを削除 (チャット継続不可になるため) - リフレッシュ失敗時はエラーをそのまま throw してインスタンスを落とす - リフレッシュ成功後に次回リフレッシュを再スケジュール
|
@claude おい、レビューしろ |
|
@akku1139 レビュー頼みます♡ |
|
Claude finished @EdamAme-x's task in 1m 6s —— View job レビュー (再レビュー #3)
akku1139 のレビュー指摘を中心に確認した結果です。 akku1139 指摘の対応状況
✅
|
| 重要度 | 項目 |
|---|---|
| 🔴 | なし |
| 🟡 | #refreshTimer のクリーンアップ未実装 |
| 🟡 | #doRefresh の匿名フォールバック削除 (PR説明と齟齬) |
| 🟡 | エラーマッチングが文字列依存 |
akku1139 の指摘は全て対応済みです。#doRefresh のフォールバック削除については、意図的なものであれば PR 説明の「フォールバックするか確認」の記載を削除するか、コメントで意図を明記すると良いです。
When refreshAuthToken fails, catch the error and fall back to fetchAnonymousToken so the session can continue with a fresh anonymous token instead of failing entirely. https://claude.ai/code/session_01KBKiHVh4UVwtzUmS7cz7LW
…H1Gm6 Fall back to anonymous token if auth token refresh fails
|
動いてそう |
|
壊れては無かったけど何故かセッション切れるので後でrevertする |
|
reverted |
Summary
refreshAuthToken関数をcore/types.tsに追加 (/api/v2/auth/refreshエンドポイント)Userクラスに#refreshTokenを保持し、refresh()メソッドで自動リフレッシュ (失敗時は匿名トークン再取得にフォールバック)uploadFile/createThreadで "Invalid token" / 401 エラー時に自動リトライする#withTokenRefreshラッパーを追加Breaking Change
Userコンストラクタの第3引数にrefreshToken: stringが追加 (手動でコンストラクタを呼んでいる場合のみ影響。User.create()経由なら変更不要)Test plan
User.create()でセッション作成後、トークン期限切れ後にuploadFileが自動リフレッシュで成功するか確認closes #15
🤖 Generated with Claude Code