詳解開放式授權——OAuth

OAuth: Open Authorization

OAuth協議為用戶資源的授權提供了一個安全的、開放而又簡易的標準。與以往的授權方式不同之處是OAUTH的授權不會使用第三方觸及到用戶的賬號信息(如用戶名與密碼),即第三方無需使用用戶的用戶名和密碼就可以申請獲得該用戶資源的授權,因此OAUTH是安全的

使用QQ號登陸慕課網:


詳解開放式授權——OAuth

OAUTH協議簡介.jpg


  1. 用戶訪問慕課網,在登錄表單中點擊了使用QQ登錄的按鈕
  2. 慕課網請求QQ的OAuth登錄頁面,用戶在該頁面輸入QQ號和密碼(此處輸入Q號和密碼的過程始終是在QQ的OAuth頁面上完成的,該頁面不屬於慕課網)
  3. QQ的OAuth服務器檢驗用戶輸入的賬號信息是否正確並把結果反饋給慕課網(反饋的結果中不包含用戶的QQ號和密碼,只是告訴慕課網當前用戶是否登錄成功)
  4. 慕課網接收到用戶登錄成功的信息之後,把用戶的登錄狀態切換為登錄成功

版本:

  • OAuth 1.0 發佈於2007年末
  • OAuth 2.0 發佈於2010年初

二、OAuth的應用場景

QQ用戶授權慕課網使用其QQ賬號相關的信息

獲取授權後,在符合權限規則的情況下訪問各種API

三、三個重要步驟分析


詳解開放式授權——OAuth

三個重要步驟.jpg

步驟一:請求OAuth登錄頁

Request Token URL :未授權的令牌請求服務地址

慕課昂請求QQ登錄頁面時使用的帶有特定參數的URL:

除了慕課網之外還有很多第三方站點在使用QQ登錄,每個站點在揭露QQ登錄之前都得到QQ互聯的官網註冊,提交一份申請的材料,說明揭露站點的描述、站點的域名、回調地址等信息,然後QQ互聯的官網會給申請使用QQ登錄的站點分配一組appid和appkey,類似賬號和密碼,appid是唯一的,每個申請QQ揭露的站點都有一個唯一的appid,這樣,對於QQ登錄的服務器來說,可以通過此id來判斷當前是哪個站點在請求使用QQ登錄,該站點是否在QQ互聯平臺提交過申請材料等;慕課網在提交申請材料的時候會把回調地址預留給QQ互聯的平臺,服務端會對比相應的appid中預留的回調地址和提交過來的參數域名是否一樣等

  • 服務器的URL:https://graph.qq.com/oauth/....?....
  • 對應appid:&client_id=100490398&....
  • 回調地址:&redirect_uri=http://www.mukewang.com/.....

步驟二:用戶使用第三方賬號登錄並授權

用戶輸入QQ號和密碼不匹配,直接被QQ的OAuth服務器拒絕,重新登錄;

在用戶正確輸入QQ號和密碼,登錄成功的情況下:

回調地址:&redirect_uri=http://www.mukewang.com/.....

就是告訴QQ的OAuth服務器,當用戶登錄成功以後,要跳轉到什麼地方去,並且在跳轉的過程中,URL後面會帶上一個加密過的參數code(http://www.mukewang.com/user/qqcallback?code=xxxxxxx...),當url跳轉回慕課網指定的回調地址之後,在代碼中可以獲取到code

步驟三:返回登錄結果

在步驟二中,慕課網拿到了一個加密過的參數code,此時,說明用戶輸入的QQ號和密碼是匹配的,即登錄成功了;但是出於安全考慮,單憑code還不能賦予第三方網站使用用戶的QQ號去執行一些操作(因為在回調的過程中,code可能會被劫持),所以,為了確保code被合法的第三方服務器獲取到,此時需要慕課網的服務器再次請求一個url地址:

User Authorization URL :用戶授權的令牌請求服務地址

用戶QQ登錄授權之後需要請求的一個帶有特定參數的URL:

https://xxx.qq.com/oauth/...?...&client_id=100490398&....&client_secret=xxxxxxxxxx&......&code=xxxxxxxxxxx......

client_id和client_secret對應慕課網得到的一組appid和appkey,分別對應這兩個參數,把他拼接到url中,最後還需要拼接上用戶授權登錄之後拿到的code參數(code是會過期的,有效時間都比較短,一般為10秒)

code是一個有生命週期且只可使用一次的字符串 ,慕課網的服務器在很短的時間內就要完成這個一來一回的數據交互過程,一旦超過這個code的有效時間,OAuth的服務器就會認為登錄的過程中可能出現了一些安全問題,然後拒絕第三方網站繼續後面的操作;如果其中有人劫持到了code,那麼他必須在很短的時間內對code進行破解,並且還需要去偽造一個對應的第三方服務器請求的url,就更困難了;多了一個一來一回的數據交互,對於OAuth的服務器來說,第一,他再次檢驗了發起請求的第三方服務器是否是一個合法的服務器並且還會對appkey作比對;第二,檢查code的合法性,查看code是否是上一個步驟發給慕課網服務器的那個code以及再次發起請求的時間是否在有效時間範圍內,通過這樣的一個檢驗來進一步提高安全性;在請求這個url之前,慕課網的服務器並不知道登錄的用戶的信息,只知道有一個用戶使用QQ號登錄了,當慕課網的服務器請求了用戶授權之後的令牌請求url之後,才會得到一個響應數據,響應數據中包含了一些信息:用戶具體是誰,QQ暱稱、頭像等一些比較基本的賬號信息,慕課網的服務器就可以把這些信息寫入到用戶數據表中,此時,code也失效了

四、AccessToken與RefreshToken數據傳輸原理和生命週期

AccessToken:用戶通過第三方應用訪問OAuth接口的令牌:

用戶發給第三方網站的令牌

在OAuth使用的過程中,當用戶授權登錄完成之後,第三方站點拿到了一個當前用戶的accessToken,有了accessToken就可以調用相應的API;訪問開放平臺的接口實質上都是通過第三方應用拼接一個特定的url來訪問API的。即使連續幾次訪問同一個API的接口,動態拼接出來的url都有可能是不一樣的。即任意一次訪問API都需要重新拼接一個特定的url,而且每次都要用上AccessToken作為令牌,出於安全考慮,一般都會使用post方式發送http請求,OAuth的服務器會驗證鏈接中的accessToken是否為合法的,把相應的數據包打包成xml或json返回給第三方的服務器。


詳解開放式授權——OAuth

accessToken和RefreshToken.jpg

AccessToken具有較長生命週期(10天半個月甚至更長)

只要accessToken沒有過期,就可以一直使用它來訪問API,如果過期了,有兩種方式重新獲取一個新的accessToken:

  • 重新授權登錄第三方站點
  • 拼接User Authorization URL時帶上一個布爾型的參數,指明在返回的結果中是否需要攜帶一個叫refreshToken的參數(刷新令牌);如果指明瞭需要它,就會在返回的數據中攜帶這個參數,(各個平臺的該參數名會有差異)當accessToken快過期的時候就可以使用這個RefreshToken動態拼接一個特定的url來請求一次,就可以獲取一個新的accessToken(一般在後臺有定時任務的時候使用)

注:RefreshToken也有生命週期,不過這個時間就更長了,基本上是幾個月到半年左右

分享自:https://www.jianshu.com/p/b20cd389f8bd


分享到:


相關文章: