升級 Strapi v5.31+ 後 JWT 過期就被登出?問題藏在你沒注意到的內建路由裡
症狀:App 開啟 15 分鐘後被強制登出 使用者回報一個詭異的問題:App 正常使用一段時間後,突然被強制登出。重新登入後又好了,但過一陣子又被踢出去。 時間規律很明確——正好 15 分鐘。這恰好是我們 JWT 的過期時間。 直覺反應是去查前端的 token refresh 邏輯:interceptor 有沒有正確攔截 401?refresh token 有沒有正確儲存?重試機制有沒有 bug? 查了一輪,全部正常。 錯誤的除錯方向 這個問題前前後後花了不少時間,方向一直在前端打轉: 排查方向 結果 Flutter interceptor 邏輯 正常,有攔截 401 並觸發 refresh Token 儲存機制(SecureStorage) 正常,refresh token 有正確保存 JWT 過期時間設定 確認是 15 分鐘,符合預期 網路連線問題 排除,其他 API 都正常 每個環節看起來都沒問題,但結果就是 refresh 失敗。問題出在哪? 轉折點:看 HTTP Status Code 直到有人(或者說,終於有人)去看了 /auth/refresh 實際回傳的 HTTP status code: # JWT 過期後呼叫 refresh curl -X POST https://api.example.com/api/auth/refresh \ -H "Content-Type: application/json" \ -d '{"refreshToken": "valid-refresh-token-here"}' # 預期:200 OK(新的 JWT) # 實際:403 Forbidden 403,不是 401。 ...