Files
a620906209 d9f0fe11c6 security(auth): P1 Token Refresh + sessionStorage
- 新增三個 refresh 端點(member/provider/admin),revoke 舊 token 發行新 7 天 token
- axios.js / coachAxios.js:401 interceptor 改為 refresh-then-retry,含 isRefreshing queue 防並發、isRedirecting flag 防雙重 redirect
- auth.js / coachAuth.js / AuthCallbackView.vue:localStorage 全改為 sessionStorage
- echo.js / notificationAxios.js:同步改為 sessionStorage
- notifications.js:401 時停止 polling(stopPolling),不印 error log
- 新增 TokenRefreshTest.php(11 tests / 24 assertions):refresh 成功/失效/跨角色 403

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-02 04:33:35 +08:00

1.0 KiB
Raw Blame History

MODIFIED Requirements

Requirement: 認證狀態管理

前端 SHALL 使用 Pinia store 管理認證狀態,token 存於 sessionStorage(非 localStorage),並在所有需認證的 API 請求自動附加 Bearer token。收到 401 時先嘗試 refresh,成功後 retryrefresh 失敗才清除 session 並導向登入頁。

Scenario: 頁面刷新後保持登入狀態

  • WHEN 已登入使用者在同一分頁重新整理頁面
  • THEN 從 sessionStorage 還原 token,使用者仍為登入狀態

Scenario: 分頁關閉後 token 自動清除

  • WHEN 使用者關閉瀏覽器分頁或瀏覽器
  • THEN sessionStorage 自動清除,重新開啟需重新登入

Scenario: Token 過期後自動 refresh

  • WHEN API 請求因 token 過期回傳 401
  • THEN 自動呼叫 POST /api/member/refresh,成功後 retry 原始請求,使用者無感知

Scenario: 登出

  • WHEN 使用者點擊登出
  • THEN 呼叫 POST /api/member/logout,清除 sessionStorage token,導向 /login