Oauth2 原理 ->Access Token & Refresh Token 到底怎么使用?原則是什么?

參考一下定義

下圖參考 RFC6749 定義的 Oauth2 中 token 使用的基本流程,看完我們就大概可以明白 Access Token 和 Refresh Token 兩個的用法了。

+--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+

               Figure 2: Refreshing an Expired Access Token

圖解 Oauth2

客戶端登入邏輯

  • A.客戶端帶有登入憑證(如:三方微信認證、自家用戶名密碼等)請求授權服務器
  • B.授權服務器返回 ac_token 和 rf_token

客戶端業務邏輯

  • C.客戶端帶有 ac_token 請求業務服務器(例如用戶資料、用戶訂單等等)
  • D.業務服務器驗證 ac_token,且成功,則返回業務數據
  • E.若客戶端帶有的 ac_token(失效、過期等)請求業務服務器
  • F.業務服務器驗證失敗,則返回 token error

刷新 Access Token 邏輯

  • G.客戶端帶上 rf_token 請求授權服務器
  • H.授權服務器真對 rf_token 驗證且通過后,返回新的 ac_token 和 rf_token

安全性思考

  • Access Token 越短越安全,但是短了影響用戶體驗
  • Refresh Token 一定保密不可泄漏,同時最好加入一些特征判定看下一條
  • Refresh Token 刷新必須判定用戶的合法性,例如 UA、IP 等資料,也可以是自己與客戶端約定的一些特征資料
  • Refresh Token 可以利用用戶的 Ua 等特征資訊,進行限定登陸設備數量(也就是一個用戶同時可以擁有幾個 Refresh Token),同時給用戶一個觀看當前在線設備列表,讓用戶真實了解在線設備的安全性,選擇性讓某設備掉線。
4 条回复 A文章作者 M管理員
  1. 我記得 Pipe 里面的同步是定時的,30s 一次輪詢。

  2. 好的呢,我觀察日志來說,發現的不同如下

    • 發布文章底下的發布按鈕,沒有發現同步的 log
    • 列表編輯按鈕的下拉里同步到社區,列出了同步成功的 log

    可能是發表文章底部的按鈕那里沒能正常觸發同步 api 吧

  3. 暫時沒有時間排查,Pipe 是開源的歡迎幫忙 debug,謝謝。

  4. @88250 老大,為啥自建的 pipe 發博文時,底下勾選同步到社區不生效了啊!必須在文章列表那的編輯按鈕下拉里面的同步方可生效,是我自己搭建的部落格有什么地方沒弄好嗎?