v1.0.3

狀態碼與錯誤標籤

最後更新


所有方法以 JWTAuthResult 回報結果;本頁列出每個 StatusCode 與 ErrorTag 組合的觸發情境。

對照表


StatusCodeErrorTag來源觸發情境
400data_missingCreateauth 為 nil
400data_missingRevoke請求沒有 Refresh ID
400data_invalidVerify簽章錯誤、nbf 未到、iat 在未來 5 分鐘以上、claim 的 Refresh ID 或指紋不符、JTI 不在 Redis 或 EXISTS jti: 呼叫失敗
401unauthorizedVerify沒有 Access Token 也沒有 Refresh ID
401unauthorized刷新Refresh ID 不存在、已過期或指紋不符
401unauthorizedRevokeRefresh ID 不存在或已過期
401revokedVerifyAccess Token 已被撤銷
401(空)刷新CheckAuth 回傳 false 或 error
429failed_to_update刷新同一 Refresh ID 的刷新鎖被占用,或 SETNX 呼叫失敗
500failed_to_createCreate、刷新Refresh ID 或刷新資料序列化失敗
500failed_to_signCreate、刷新JWT 簽署失敗(例如金鑰不是 P-256)
500failed_to_storeCreate、刷新、RevokeRedis 寫入失敗
500failed_to_getVerify、RevokeRedis 讀取失敗

「刷新」指由 Verify 內部觸發的 透明刷新,結果經 Verify 回傳。

Error 欄位


Error 是給人讀的訊息,內容可能包含底層錯誤字串(例如 Redis 或 JWT 函式庫的訊息),不應直接回傳給終端使用者,也不應用來做程式判斷;程式判斷一律用 StatusCode 與 ErrorTag。
中介層失敗時只回 {"error": Error},不含 ErrorTag(見 中介層)。

依標籤處理


  1. result := auth.Verify(w, r)
  2. if !result.Success {
  3. switch result.ErrorTag {
  4. case "revoked", "unauthorized", "":
  5. http.Error(w, "please sign in", http.StatusUnauthorized)
  6. case "failed_to_update":
  7. w.Header().Set("Retry-After", "1")
  8. http.Error(w, "retry", http.StatusTooManyRequests)
  9. case "data_invalid", "data_missing":
  10. http.Error(w, "invalid credentials", http.StatusBadRequest)
  11. default:
  12. log.Printf("go-jwt: %s", result.Error)
  13. http.Error(w, "internal error", http.StatusInternalServerError)
  14. }
  15. return
  16. }
EN