OAuth2.0及token刷新流程


最近面試遇到了客戶端授權登陸流程的問題,於是記錄一下,目前最流行的方案就是OAuth2.0了。

一、首先來看一下OAuth2.0的原理

OAuth 2.0 是一種授權機制,主要用來頒發令牌(token)。而在傳統的客戶端-服務端授權模型中,客戶端想要請求服務端受保護的資源就必須通過資源擁有者的憑證。但是為了提供給第三方應用訪問資源的權限,那么資源擁有者就必須把這個憑證共享給第三方,此時會出現幾個問題:

1、第三方應用需要存儲資源擁有者的憑據以供以后使用,通常密碼以明文形式。

2、服務端需要支持密碼認證,盡管這種來自密碼的安全性比較弱。

3、第三方應用獲得資源的廣泛的權限,是的資源擁有者不能限制訪問時間和權限。

4、資源擁有者不能中斷單個第三方的訪問權限,除非中斷所有的第三方權限,這時就必須修改密碼了。

OAuth通過引入authorization層解決了這些問題,並且將資源擁有者和客戶端這些角色分離開來。替代使用資源擁有者的憑據,而是使用一個權限令牌token,它具有具體的范圍限制,生命周期,以及其他的權限屬性。

OAuth定義了四個角色:分別是resource owner、resource server、client、authorization server。

resource owner 是可以授權資源權限的一個實體,一般指的是終端用戶;

resource server 是部署資源的服務器,它可以接收並且響應對資源的攜帶token的請求;

client 是指應用,比如服務端應用,桌面應用,或者其他的設備應用;

authorization server 它是發行token給client的服務器;

這四個角色直接的交互可以參考下圖

這是從請求授權,到生成token並訪問數據資源的完整的流程示意圖

步驟:

  (A) 客戶端應用向資源擁有者申請授權

  (B) 資源擁有者同意授權 

  (C) 客戶端拿到同意授權的許可向授權服務器請求獲取令牌token

  (D) 授權服務器授權成功生成token並返回給客戶端

  (E) 客戶端使用token請求資源服務器,一般token放於請求頭中

  (F) 資源服務器返回客戶端需要的數據資源,到此流程結束

在此流程中以后的請求中,有一個重要的環節,就是刷新token,我們不能每次請求數據都要重新授權獲取新的token,這樣浪費資源,也不合理。

OAuth 2.0 允許用戶自動更新令牌。具體方法是,授權服務器發行令牌的時候,一次性發行兩個令牌,一個用於獲取數據,另一個用於獲取新的令牌(refresh token 字段)。令牌到期前,用戶使用 refresh token 發一個請求,去更新令牌。

二、具體的刷新token的實現流程

一般是用戶通過賬號和密碼登陸系統,用戶就可以正常操作了,但是登陸授權生成的token是有時效性的,如果token過期了就不能繼續訪問了,這時為了避免用戶頻繁的登陸授權,就采用了定期刷新token來保持用戶處於登陸狀態,這對於用戶來說是無感的。

1、通過賬號密碼登陸后,會獲取到token(授權令牌)、refresh_oken(用於刷新token的令牌)、expire_time(令牌token的時效)這三個信息,將這三個連同登陸的時間點(login_time)保存下來以供后續刷新token使用。

2、在以后的操作過程中,每次請求接口時,都檢查當前時間current_time與登陸時間login_time的時間差與時效expire_time的大小,如果current_time-login_time大於expire_time亦或者某個閥值,則就使用refresh_token去重新獲取token,來更新本地存儲的token以達到刷新的目的。

注意一點是,refresh_token的失效性要比token的時效性長很多,這樣可以實現token的一直刷新了;但是如果用戶長時間為操作,那么refresh_token也過期了,就會強制用戶登出。

 另外在刷新token時,還有一個方案,一般是使用輪詢機制,定期請求刷新token,此方法實現起來稍微簡潔些。

 

參考:https://blog.csdn.net/hfhwfw161226/article/details/106904834/

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM