【轉載】OAuth的機制原理講解及開發流程

一、OAuth的簡述html

  OAuth(Open Authorization,開放受權)是爲用戶資源的受權定義了一個安全、開放及簡單的標準,第三方無需知道用戶的帳號及密碼,就可獲取到用戶的受權信息,而且這是安全的。(我喜歡簡單明瞭,這裏沒看懂,不要緊,接着往下面看)算法

  二、OAuth的原理api

                                                         (流程圖)安全

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

  第一步:用戶訪問第三方網站,好比:就是你須要使用QQ進行登陸的網站;app

  第二步:你點擊QQ登陸後,第三方網站將會鏈接並進行請求,好比:你點擊登陸後,第三方網站會跳轉到QQ平臺,提示你進行登陸;學習

  第三步:你要進行受權第三方網站對你的信息訪問的一個權限,好比:當你QQ登陸成功後,QQ會提示你,是否受權第三方Web訪問你的用戶基本信息或其餘的資源信息,這時你點擊受權便可;網站

  第四步:受權後,第三方Web便可訪問你剛纔受權的資源信息,好比:你的QQ基本信息-頭像、暱稱、性別等。google

  經過這個原理圖示及講解(圖是手工製做,有點草),相信你們都瞭解了OAuth這個原理的一個基本流程,若看不明白,你能夠不用學習製做OAuth了,開個玩笑。(這步後,你們知道什麼原理了,但仍是沒法知道OAuth到底是如何實現認證的,別急,接着往下看)加密

  三、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,返回後到這步整個認證流程就結束了,最後一步,是經過數據令牌等參數,調用接口獲取用戶信息,不徹底算認證的流程。(我喜歡簡潔明瞭,認證流程就是這樣,相信經過圖示及講解都能明白,如有不明白之處請留言)

  四、QQ OAuth1.0認證中Url的調用及參數的傳遞

  前面講了OAuth1.0的機制原理及認證流程,這篇文章着重講解QQ OAuth1.0認證中Url的調用、各參數的傳遞、注意事項。而由於如今QQ開發平臺上,已經不多能找到OAuth1.0認證的說明開發文檔了,採用新的2.0認證模式,因此簡單講述Url請求與返回參數的傳遞,並無很詳細深刻地講解,有什麼問題你們可留言給我。

  4.一、請求未受權的臨時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 簽名值,用來提升傳輸過程參數的防篡改性。

簽名值的生成詳見【QQ登陸】簽名參數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.二、請求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 簽名值,用來提升傳輸過程參數的防篡改性。

簽名值的生成詳見【QQ登陸】簽名參數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.三、經過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 簽名值,用來提升傳輸過程參數的防篡改性。

簽名值的生成詳見【QQ登陸】簽名參數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源代碼分享給你們,代碼分享:點擊下載

  五、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認證流程就是這樣,相信經過圖示及講解都能明白,如有不明白之處請留言)

相關文章
相關標籤/搜索