v1.0.3

客戶端整合

最後更新


本頁列出客戶端要送哪些 Cookie/header、會收到哪些回應,以及瀏覽器與非瀏覽器客戶端各自的串接方式。

請求輸入


來源名稱用途
Cookieaccess_token(AccessTokenCookieKey)Access Token,優先於 Authorization header
HeaderAuthorization: Bearer <token>Access Token(無 Cookie 時)
HeaderX-Refresh-IDRefresh ID,優先於 Cookie
Cookierefresh_id(RefreshIdCookieKey)Refresh ID
HeaderX-Device-FP直接指定裝置指紋
HeaderX-Device-ID裝置 ID,優先於 Cookie
Cookieconn.device.id裝置 ID

回應輸出


時機Set-CookieHeader
Create() 登入access_token、refresh_id、conn.device.id—
刷新:僅重簽access_tokenX-New-Access-Token
刷新:整組重發access_token、refresh_id—
Revoke()清除 access_token、refresh_id—
每次計算指紋(未帶 X-Device-FP)conn.device.id(90 天)—

Cookie 預設 HttpOnly、http.SameSiteLaxMode、Path /、非 Secure,可由 設定 的 Cookie 覆寫。

瀏覽器


同網域的網頁不需要任何額外處理:Cookie 自動帶上與更新,刷新對前端透明。需要注意:
情境處理
跨網域 API前端以 credentials: "include" 送出;後端 CORS 允許 credentials,Cookie 設 http.SameSiteNoneMode 與 Secure
Access Token 過期時同時送出多個請求部分請求會收到 429,稍候重送即可(見 透明刷新)
正式環境Cookie.Secure 設為 true

  1. async function api(path, init = {}) {
  2. for (let attempt = 0; attempt < 3; attempt++) {
  3. const res = await fetch(path, { ...init, credentials: "include" });
  4. if (res.status !== 429) return res;
  5. await new Promise(r => setTimeout(r, 300));
  6. }
  7. throw new Error(`refresh contention on ${path}`);
  8. }

非瀏覽器客戶端(行動 App、CLI、服務)


要求原因
每個裝置產生一個固定值,每次請求帶 X-Device-FPUA 無法辨識時指紋每次都不同(見 裝置指紋)
同時送 Access Token 與 Refresh ID驗證會比對 Token 內的 Refresh ID(見 驗證流程 第 7 步)
解析每個回應的 Set-Cookie整組重發時新的 Refresh ID 只出現在 Set-Cookie: refresh_id,沒有對應 header
收到 X-New-Access-Token 時更新本地 Access Token僅重簽時的新 Token

使用支援 Cookie 的 HTTP client(例如 Go 的 net/http/cookiejar、OkHttp 的 cookie jar)並讓它保存 access_token/refresh_id,是最不容易漏掉整組重發的作法。
  1. # 登入
  2. curl -s -H "X-Device-FP: device-7f3a9c" -c jar.txt -b jar.txt -X POST http://localhost:8080/login
  3. # 之後每次請求都帶同一指紋,並把回應的 Cookie 寫回 jar
  4. curl -s -H "X-Device-FP: device-7f3a9c" -c jar.txt -b jar.txt http://localhost:8080/me -D -

以 header 傳遞時:
  1. curl -s http://localhost:8080/me \
  2. -H "X-Device-FP: device-7f3a9c" \
  3. -H "Authorization: Bearer <token>" \
  4. -H "X-Refresh-ID: <refresh_id>" \
  5. -D -

錯誤處理建議


狀態碼客戶端動作
401導向登入
429稍候重送
400憑證與裝置不符或格式錯誤;清除本地憑證後重新登入
5xx伺服器或 Redis 異常,可重試

完整對照見 狀態碼與錯誤標籤。
EN