v1.0.3

撤銷

最後更新


Revoke() 實作登出:清除 Cookie、讓目前的 Access Token 立即失效,並讓 Refresh ID 在 5 秒後失效。

流程


#步驟失敗時
1送出清除 access_token 與 refresh_id Cookie 的 Set-Cookie(不論後續成敗)—
2取得 Refresh ID無 → 400 data_missing
3讀取 refresh:<id>不存在 → 401 unauthorized;Redis 錯誤 → 500 failed_to_get
4讀取 TTLTTL ≤ 0 → 401 unauthorized
5MULTI:refresh:<id> TTL 改為 5 秒、寫入 revoke:<accessToken>(TTL AccessTokenExpires)500 failed_to_store

成功時回傳 200,Success 為 true。

範例


  1. mux.HandleFunc("POST /logout", func(w http.ResponseWriter, r *http.Request) {
  2. result := auth.Revoke(w, r)
  3. if !result.Success && result.StatusCode >= 500 {
  4. http.Error(w, result.Error, result.StatusCode)
  5. return
  6. }
  7. w.WriteHeader(http.StatusNoContent)
  8. })

400/401 代表工作階段已不存在,Cookie 也已清除,對使用者而言等同已登出,上例因此只把 5xx 當成錯誤。

邊界


情境行為
Refresh ID 保留 5 秒撤銷後 5 秒內,帶同一 Refresh ID(例如透過 X-Refresh-ID)且沒有 Access Token 的請求仍可刷新成功
撤銷範圍只作廢請求中的那一個 Access Token;同一使用者在其他裝置的工作階段不受影響
未帶 Access Token仍會寫入 revoke:(鍵為空字串),Refresh ID 照常失效
重複登出第二次因 Cookie 已清除而回 400 data_missing

撤銷後的驗證結果見 驗證流程 第 2 步。
EN