1. 程式人生 > >OAuth1.0/2.0的機制原理講解及開發流程

OAuth1.0/2.0的機制原理講解及開發流程

1、OAuth的簡述

OAuth(Open Authorization,開放授權)是為使用者資源的授權定義了一個安全、開放及簡單的標準,第三方無需知道使用者的賬號及密碼,就可獲取到使用者的授權資訊,並且這是安全的。(我喜歡簡單明瞭,這裡沒看懂,沒關係,接著往下面看)

2、OAuth的原理

(流程圖)

我在圖上分了四個步驟,下面是四步的講解:

第一步:使用者訪問第三方網站,比如:就是你需要使用QQ進行登入的網站;

第二步:你點選QQ登入後,第三方網站將會連線並進行請求,比如:你點選登入後,第三方網站會跳轉到QQ平臺,提示你進行登入;

第三步:你要進行授權第三方網站對你的資訊訪問的一個許可權,比如:當你QQ登入成功後,QQ會提示你,是否授權第三方Web訪問你的使用者基本資訊或其他的資源資訊,這時你點選授權即可;

第四步:授權後,第三方Web即可訪問你剛才授權的資源資訊,比如:你的QQ基本資訊-頭像、暱稱、性別等。

通俗的講呢,OAuth認證和授權的過程如下: 1、使用者訪問第三方網站網站,想對使用者存放在服務商的某些資源進行操作。 2、第三方網站向服務商請求一個臨時令牌。 3、服務商驗證第三方網站的身份後,授予一個臨時令牌。 4、第三方網站獲得臨時令牌後,將使用者導向至服務商的授權頁面請求使用者授權,然後這個過程中將臨時令牌和第三方網站的返回地址傳送給服務商。 5、使用者在服務商的授權頁面上輸入自己的使用者名稱和密碼,授權第三方網站訪問所相應的資源。 6、授權成功後,服務商將使用者導向第三方網站的返回地址。 7、第三方網站根據臨時令牌從服務商那裡獲取訪問令牌。 8、服務商根據令牌和使用者的授權情況授予第三方網站訪問令牌。 9、第三方網站使用獲取到的訪問令牌訪問存放在服務商的對應的使用者資源。 通過這個原理圖示及講解(圖是手工製作,有點草),相信大家都瞭解了OAuth這個原理的一個基本流程,若看不明白,你可以不用學習製作OAuth了,開個玩笑。(這步後,大家知道什麼原理了,但還是無法知道OAuth究竟是如何實現認證的,別急,接著往下看)

3、OAuth 1.0的認證流程

這裡直接講解OAuth 1.0協議的認證機制(OAuth 2.0會在下一節中講述),雖然現在很多平臺都是遵循OAuth 2.0,但還是有開放OAuth 1.0平臺的,比如:新浪微博、QQ1.0平臺等。

在OAuth 1.0認證中會用到三個重要的Url:

第一個:Request Token Url,獲取未授權的Token的Url;

第二個:User Authorization Url,請求使用者對Token進行授權的Url;

第三個:Request Access Url,使用Token獲取Access Token的Url。

上面是認證流程中用到的三個Url,在下面的流程示意圖中會體現到,這是我講解OAuth幻燈片的一頁,直接截圖下來進行講解:

第一步:網站向認證平臺請求一個未授權的Token,這個Request Token Url是前面說的第一個Url;

第二步:跳轉至使用者授權頁面,提示使用者進行登入,並進行授權,返回獲得已授權的Token,用到的User Authorization Url是前面說的第二個Url;

第三步:通過已授權的Token,向認證平臺請求Access Token(資料令牌),用到的Request Access Url是前面說的第三個Url,返回後到這步整個認證流程就結束了,最後一步,是通過資料令牌等引數,呼叫介面獲取使用者資訊,不完全算認證的流程。(我喜歡簡潔明瞭,認證流程就是這樣,相信通過圖示及講解都能明白,若有不明白之處請留言)

4、QQ OAuth1.0認證中Url的呼叫及引數的傳遞

前面講了OAuth1.0的機制原理及認證流程,這篇文章著重講解QQ OAuth1.0認證中Url的呼叫、各引數的傳遞、注意事項。而因為現在QQ開發平臺上,已經很少能找到OAuth1.0認證的說明開發文件了,採用新的2.0認證模式,所以簡單講述Url請求與返回引數的傳遞,並沒有很詳細深入地講解,有什麼問題大家可留言給我。

4.1、請求未授權的臨時Token

新建一個頁面為QQLogin.aspx,用來請求臨時Token及跳轉到使用者授權頁。下面是相關Url及引數介紹:

Request Token Url(請求臨時Token的Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_request_token

請求後,跳轉至引導使用者登入的Url:http://openapi.qzone.qq.com/oauth/qzoneoauth_authorize

第一個Url請求引數包含如下內容:(紅色為必填、綠色為選填)

引數 含義
oauth_consumer_key 申請QQ登入成功後,分配給網站的appid
oauth_nonce 隨機字串,所有oauth_nonce請使用int型值。
oauth_timestamp unix時間戳(從UTC時間1970年1月1日00:00:00到當前時刻的秒數,不同語言中如何獲取請google/baidu之)。
注意第三方伺服器時間與騰訊伺服器時間相差不能超過5分鐘。
oauth_version 版本號,請固定使用1.0
oauth_signature_method 簽名方法,請固定使用HMAC-SHA1。
oauth_signature
oauth_client_ip 使用者的IP地址(可選),int型

返回的引數有:oauth_token(臨時令牌)、oauth_token_secret(臨時金鑰對應的令牌)

第二個Url需要傳遞的引數為:

引數 含義
oauth_consumer_key 分配給網站的appid。
oauth_token 上一步中,得到的oauth_token
oauth_callback 回撥地址,即登入並授權後返回到你網站上的地址。

  返回的引數有:

引數 含義
oauth_token 已授權的token
openid 與APP通訊的使用者key,它和QQ號碼一一對應,訪問OpenAPI時必需。
同一個QQ號碼在不同的應用中有不同的OpenID。 
oauth_signature 簽名值。如果網站使用這一步返回的openid,則需要按規則生成簽名值,並與該簽名值比對,以驗證openid以及來源的可靠性。
比對時生成簽名值的規則:使用HMAC-SHA1演算法,源串:openid+openid的timestamp(串中間不要新增’+’符號);金鑰:oauth_consumer_secret。
timestamp openid的時間戳
oauth_vericode 授權驗證碼。

 4.2、請求Access Token資料令牌

上一步中,我們寫了一個回撥地址,並順利得到一些引數,下面就是拿這些引數來進行下一步操作,首先,得到資料令牌(只有拿到資料令牌才可以呼叫介面獲取使用者資訊)。

Request Access Url(獲取Access Token請求Url):http://openapi.qzone.qq.com/oauth/qzoneoauth_access_token

Url請求引數包含如下內容:

引數 含義
oauth_consumer_key 分配給網站的appid
oauth_token 已授權的的token,上一步返回的oauth_token
oauth_nonce 隨機數
oauth_timestamp unix時間戳(從UTC時間1970年1月1日00:00:00到當前時刻的秒數,不同語言中如何獲取請google/baidu之)
oauth_version 版本號,請固定使用1.0
oauth_signature_method 簽名方法,請固定使用HMAC-SHA1
oauth_signature
oauth_vericode 授權驗證碼,上一步返回的oauth_vericode
oauth_client_ip 使用者的IP地址(可選),int型

返回的引數如下:

引數 含義
oauth_token 具有訪問許可權的access_token
oauth_token_secret access_token的金鑰
openid 在第一步和本步驟中都返回了openid。使用本步驟返回的openid,更為安全
timestamp openid的時間戳
oauth_signature 針對openid的簽名值

4.3、通過Access token(資料令牌)呼叫API介面,獲取使用者授權資源

請求Url:http://openapi.qzone.qq.com/user/get_user_info (這裡預設寫的是get_user_info介面
  請求引數:

引數 含義
oauth_consumer_key 分配給網站的appid
oauth_token 上一步返回的oauth_token
oauth_nonce 隨機數,int型
oauth_timestamp unix時間戳(從UTC時間1970年1月1日00:00:00到當前時刻的秒數,不同語言中如何獲取請google/baidu之)。
oauth_version 版本號,固定使用1.0
oauth_signature_method 簽名方法,固定使用HMAC-SHA1
oauth_signature
openid 上一步返回的openid。
oauth_client_ip 使用者的IP地址(可選),int型

好了,上面就是整個QQ OAuth1.0認證流程中Url引數的請求與返回說明,這OAuth1.0認證中,你會發現引數特別多,還有經過HMAC-SHA1加密、簽名等操作,特別麻煩、繁瑣,所以還是最好推薦使用OAuth 2.0認證協議進行介面開發。

下面這篇文章是QQ登入製作過程中,公共返回碼說明(包含1.0、2.0),供大家參考,看是哪個階段出錯,然後對症下藥,特別是引數的請求、傳遞是否正確,還有一個引數順序、簽名是否正確,這四點弄好,相信這個東西自然就實現了。

OAuth_QQ登入_公共返回碼說明:點選進入

最後將自己開發製作的OAuth 1.0原始碼分享給大家,程式碼分享:點選下載

5、OAuth2.0的認證流程

在OAuth2.0的處理流程,主要分為以下四個步驟:

1)得到授權碼code

2)獲取access token

3)通過access token,獲取OpenID

4)通過access token及OpenID呼叫API,獲取使用者授權資訊

上面是流程的大概四個步驟,在下面的流程示意圖中會得到體現,這是我製作的一個幻燈片的流程圖(文章最後會附上製作的OAuth幻燈片分享給大家),這裡就直接截圖下來進行講解:

第一步:首先直接跳轉至使用者授權地址,即圖示 Request User Url ,提示使用者進行登入,並給予相關資源授權,得到唯一的Auth code,這裡注意的是code只有10分鐘的有效期,對於安全考慮,相對於OAuth 1.0省了一步獲取臨時的Token,並且有效期也進行了控制,比1.0認證簡化了很多,並安全一些;

第二步:得到授權code後,這一步就是請求access token,通過 圖示 Request access url ,生成得到資料Token;

第三步:通過Access Token請求OpenID,OpenID是使用者在此平臺的唯一標識,通過圖示 Request info url 請求,然後得到OpenID;

第四步:通過第二步得到的資料Token、第三步得到的OpenID及相關API,進行請求,獲取使用者授權資源資訊。(我喜歡簡潔明瞭,OAuth2.0認證流程就是這樣,相信通過圖示及講解都能明白,若有不明白之處請留言)

課件分享:點選下載