2015-06-14 65 views
18

我的iOS移動應用程序使用通過OAuth2.0協議實現的服務。 OAuth訪問令牌隨附一個刷新令牌和一個expires_in字段。我在應用程序中保存了刷新令牌和訪問令牌過期時間,但沒有關於何時使用它們的好主意。如何識別OAuth令牌是否已過期?

  • 那麼使用這個expires_in的通常和最佳做法是什麼?
  • 如何識別我的訪問令牌已過期?
  • 是否有一個常見的Web服務錯誤格式,說我的訪問令牌已過期?

回答

29

以下是有關OAuth 2.0令牌刷新的信息。

過期在定義

的OAuth的2.0標準,RFC 6749,所述expires_in字段定義爲幾秒到期滿的數目:

expires_in:建議的。訪問令牌的生存時間(秒)。例如,值「3600」表示訪問令牌將在生成響應之後的一小時內過期。如果省略,授權服務器應該通過其他方式提供到期時間或記錄默認值。

令牌刷新處理:方法1

在接收到有效access_tokenexpires_in值,refresh_token等,客戶端可以通過存儲的到期時間,並檢查它在每次請求處理此。這可以通過以下步驟來完成:

  1. 轉換expires_in到到期時間(紀元,ISO日期時間等)
  2. 店每個資源請求的到期時間
  3. ,覈對當前時間有效期限,使資源請求之前令牌刷新請求如果access_token已過期

除了接收到新的access_token,您可能會收到一個新的refresh_token有過期時間F在未來。如果您收到此消息,則應該存儲新的refresh_token以延長會話的使用期限。

令牌刷新處理:方法2

處理令牌刷新的另一種方法是接收一個無效的令牌錯誤之後手動刷新。這可以通過以前的方法完成,也可以通過它自己完成。

如果您嘗試使用過期的access_token,並且您收到無效的令牌錯誤,則應執行令牌刷新(如果您的刷新令牌仍然有效)。由於不同的服務可以爲過期令牌使用不同的錯誤代碼,因此您可以跟蹤每個服務的代碼,或者跨服務刷新令牌的簡單方法是在遇到4xx錯誤時簡單嘗試一次刷新。

無效的訪問令牌錯誤

以下是廣受歡迎的服務的一些錯誤代碼:

  1. Facebook: Error 467 Invalid access token - 訪問令牌已過期,被撤銷,或者無效 - 處理過期的訪問令牌。
  2. LinkedIn: Error 401 Unauthorized
  3. PayPal: Error 401 Unauthorized

刷新令牌到期

如果您refresh_token也會過期,則需要再次通過授權過程。

+0

嗨,非常感謝您的回覆!在檢查到期時間時,如果用戶更改設備時間會怎樣?它會不會導致刷新訪問令牌太頻繁?關於檢查無效令牌錯誤,您是否對oAuth服務器將返回的響應代碼和錯誤格式有所瞭解?這將是所有oAuth服務器的錯誤響應是否相同? – XiOS

+0

經常發生設備時間變化的一些用例是什麼?時區更改應自動處理。由於標準中沒有定義無效令牌錯誤代碼,因此不同的服務選擇了上面列出的不同錯誤代碼。如上所述,簡單的刷新方法可能是針對4xx錯誤嘗試單次刷新。 – Grokify