原文地址:http://kb.cnblogs.com/page/189153/
本想前段時間就把自己通過QQ OAuth1.0、OAuth2.0協議進行驗證而實現QQ登錄的心得及Demo實例分享給大家,可一直很忙,今天抽點時間說下OAuth1.0協議原理,及講解下QQ對於Oauth1.0的認證開發。閒話多說了點,下面直接進入主題。
1、OAuth的簡述
OAuth(Open Authorization,開放授權)是爲用戶資源的授權定義了一個安全、開放及簡單的標準,第三方無需知道用戶的賬號及密碼,就可獲取到用戶的授權信息,並且這是安全的。(我喜歡簡單明瞭,這裏沒看懂,沒關係,接着往下面看)
2、OAuth的原理
(流程圖)
我在圖上分了四個步驟,下面是四步的講解:
第一步:用戶訪問第三方網站,比如:就是你需要使用QQ進行登錄的網站;
第二步:你點擊QQ登錄後,第三方網站將會連接並進行請求,比如:你點擊登錄後,第三方網站會跳轉到QQ平臺,提示你進行登錄;
第三步:你要進行授權第三方網站對你的信息訪問的一個權限,比如:當你QQ登錄成功後,QQ會提示你,是否授權第三方Web訪問你的用戶基本信息或其他的資源信息,這時你點擊授權即可;
第四步:授權後,第三方Web即可訪問你剛纔授權的資源信息,比如:你的QQ基本信息-頭像、暱稱、性別等。
通過這個原理圖示及講解(圖是手工製作,有點草),相信大家都瞭解了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 |
簽名值,用來提高傳輸過程參數的防篡改性。 簽名值的生成詳見【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.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 |
簽名值,用來提高傳輸過程參數的防篡改性。 簽名值的生成詳見【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.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 |
簽名值,用來提高傳輸過程參數的防篡改性。 簽名值的生成詳見【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源代碼分享給大家,代碼分享:點擊下載。
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認證流程就是這樣,相信通過圖示及講解都能明白,若有不明白之處請留言)
最後,分享自己關於OAuth1.0、2.0認證流程講解的幻燈片,結合文章來看,你會更容易理解。
課件分享:點擊下載 (麻煩保留博主信息,謝謝)
- 相關博文推薦
- 關於ios的通訊錄信息獲取
- java synchronized詳解
- 播放或捕獲音頻聲音。發送和接收的多播( ...
- Android開發之自定義dialog的...
- vsftpd as ftp server
- WebRTC基於事件視頻廣播與1000人...
- CentOS-6.3安裝配置Tomcat...
- android安全學習筆記(四)