v1.0.3

驗證流程

最後更新


本頁說明 Verify() 對一個請求依序做的檢查,以及每一步失敗時的回應。

取得憑證


憑證讀取順序
Access Token1. Cookie access_token(AccessTokenCookieKey) 2. Authorization: Bearer <token>
Refresh ID1. Header X-Refresh-ID 2. Cookie refresh_id(RefreshIdCookieKey)
裝置指紋見 裝置指紋

檢查順序


#檢查失敗時
1有 Access Token有 Refresh ID → 進入 透明刷新;兩者皆無 → 401 unauthorized
2Redis revoke:<accessToken> 不存在存在 → 401 revoked;Redis 錯誤 → 500 failed_to_get
3簽章演算法為 ECDSA 且以公鑰驗章通過400 data_invalid
4未過期(exp)過期 → 進入 透明刷新
5nbf 不晚於現在400 data_invalid
6iat 不超過現在 5 分鐘以上400 data_invalid
7claim refresh_id 等於請求帶的 Refresh ID400 data_invalid
8claim fp 等於本次指紋400 data_invalid
9Redis jti:<jti> 存在400 data_invalid

全部通過時回傳 200,Data 為由 claims 還原的 Auth。

行為重點


  • Access Token 必須搭配 Refresh ID:第 7 步要求 claim 內的 Refresh ID 與請求相符,只帶 Authorization 不帶 Refresh ID 的請求會失敗。
  • 過期判斷優先於其他錯誤:簽章驗證錯誤訊息含 expired 時一律走刷新,不回 400。
  • 撤銷檢查以 Access Token 字串為鍵:撤銷的是那一個 Token,不是使用者。

範例


  1. result := auth.Verify(w, r)
  2. switch {
  3. case result.Success:
  4. log.Printf("user %s", result.Data.ID)
  5. case result.ErrorTag == "revoked":
  6. http.Error(w, "session revoked", result.StatusCode)
  7. default:
  8. http.Error(w, result.Error, result.StatusCode)
  9. }

Verify 可能寫入 Cookie 與 header(刷新時),必須在寫入回應主體之前呼叫。完整錯誤對照見 狀態碼與錯誤標籤。
EN