1. 程式人生 > >OAuth2.0 授權許可 之 Authorization Code

OAuth2.0 授權許可 之 Authorization Code

寫在前面:

    在前一篇部落格《OAuth2.0 原理簡介》中我們已經瞭解了OAuth2.0的原理以及它是如何工作的,那麼本篇我們將來聊一聊OAuth的一種授權許可方式:授權碼(Authorization Code)

什麼是Authorization Code ?

   簡單來說授權碼就是的在第三方應用程式請求Authrization Server來獲取AccessToken之前的預先校驗,增加了獲取token的安全性。比如你吭哧吭哧寫了一天的程式碼,急於回家吃上一口媳婦做的熱飯。當你走到小區門口的時候你需要刷卡才能進入到小區,然後找到你家在哪一棟樓,幾單元幾號,然後掏出鑰匙開門,才能回到家。在這個過程中授權碼就相當於是你在用鑰匙開門回家的前一步身份確認,如果你不是這個小區的,那你自然是沒有辦法進入到小區內部的。授權碼方式是OAuth2.0最常用的一種授權方式,比如:QQ,豆瓣,新浪微博等用的都是這種方式。

授權碼的工作流程解析

 

上圖的流程表示了請求的全過程,需要注意的點是:

發起授權請求需要的引數如下:

對應步驟(C),客戶端向Authorization Server發起請求的時候需要提供以下引數:

  1. response_type:必選。值固定為“code”。
  2. client_id:必選引數(第三方應用的標識ID,告訴伺服器誰需要得到授權)
  3. state:Client提供的一個字串,伺服器會原樣返回給Client。
  4. redirect_uri:必選引數(授權成功後的重定向地址)
  5. scope:可選引數(表示授權範圍)

完整URL如下所示:

GET /authorize?response_type=code&client_id=1&state=xyz&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Foauth2&scope=user,photo HTTP/1.1
Host: server.example.com

得到授權返回資料如下:

對應上圖中的步驟(E),A授權伺服器會返回下面資訊:

  1. code:授權碼(用於的下一步中請求token使用)
  2. state:步驟(C)中客戶端提供的state引數原樣返回。

完整的URL如下:

Location: https://client.example.com/oauth2?code=SplxlOBeZQQYbYS6WxSbIA&state=xyz

發起獲取token的請求引數如下:

對應步驟(G):

  1. grant_type:必選引數(固定值“authorization_code”)
  2. code : 必選引數(上一步Response 中響應的code,避免在請求的過程中被篡改)
  3. redirect_uri:必選引數(必須和Request中提供的redirect_uri相同)
  4. client_id:必選引數(必須和上一步Request中提供的client_id相同,不能token和授權碼請求的第三方應用不一致)

得到token的response包含如下資訊:

對應步驟(H):

  1. access_token:訪問令牌(伺服器端加密過的字串)。
  2. refresh_token:重新整理令牌(重新整理令牌的字串)
  3. expires_in:過期時間(令牌的過期時間)
{
   "access_token":"MJhjskotnFZFEjr1zCsicHJKSLA",
   "token_type":"granttype",
   "expires_in":4800, 
   "refresh_token":"JHJhjasdsjhKNSGKmzHDK", 
   "example_parameter":"example_value_test"
}

  如果有一天你的小區的鑰匙被一個陌生人拿到了,那麼他就可以名正言順的進入的小區裡面,那麼他進入到你家的機會就大了很多。一樣的道理,授權碼如果被竊取的話,那麼對方就可以直接用你的授權碼來獲取到token從而竊取到你的資訊,在使用的時候我們首先要要求授權碼不能夠被重複使用,如果一旦發現在token的生命週期內授權碼被重複使用的話則會強制銷燬此授權碼生成的所有token,重新再做一次登陸的授權驗證。

寫在最後:

    授權碼是我們平時用到的最多的一種授權方式,它使得我們的的應用程式在獲取token之前多了一個額外的安全層來保證我們的授權和訪問過程是安全可靠的。