天天看點

搞清如何使用oAuth 1.0 & 1.0a前言第一步: 擷取未授權的Request Token第二步:請求使用者授權Request Token第三步:使用授權後的Request Token換取Access Token總結

看這篇博文的朋友,我建議先去了解一下什麼是 oAuth 1.0 & 2.0的認證,對于,一些很基本的概念,各大提供該認證的網站應該說的很清楚了,這篇博文是比較細的說下,在oAuth 認證時遇到的問題,以及整個認證用戶端api調用的過程

我說下,目前我知道的提供oAuth 認證的網站(牆外的這裡就不提了),大家如果想補充的話,我非常歡迎.

oAuth 1.0 || 1.0a

豆瓣

<a href="http://www.douban.com/service/">http://www.douban.com/service/</a>

騰訊

<a href="http://open.t.qq.com/home/">http://open.t.qq.com/home/</a>

360開發者平台

<a href="http://open.app.360.cn/">http://open.app.360.cn/</a>

網易開放平台

<a href="http://open.t.163.com/">http://open.t.163.com/</a>

搜狐開放平台

<a href="http://open.t.sohu.com/">http://open.t.sohu.com/</a>

oAuth 2.0

新浪微網誌

<a href="http://open.weibo.com/">http://open.weibo.com/</a>

百度連結

<a href="http://dev.baidu.com/connect/">http://dev.baidu.com/connect/</a>

人人網

<a href="http://dev.renren.com/">http://dev.renren.com/</a>

以上是我知道是使用oAuth 認證的的開放平台,特别說一下,oAuth 1.0爆發了 一個漏洞,是以就會有個oAuth 1.0a的版本,至于oAuth 1.0 和 oAuth 2.0 的差別?自己百度一下吧.

以上網站,我基本都比較過了,oAuth 2.0的操作簡化了很多(牆外對這個oAuth2.0 支援得還是不錯的),友善了很多,而且新浪那個例子寫得很不錯,是以,我這篇博文,并不打算說oAuth 2.0,因為,之前我還寫了一個jQuery Mobile 的教程,打算做一個項目來貫通所有知識點,我選用的是豆瓣API,由于,豆瓣API提供的PHP架構實在夠龐大,而且,我用的免費空間商肯定是不支援那個架構,當然,最近,豆瓣上有人開源了一個PHP的豆瓣API架構,不過,等到我知道的時候,我已經把oAuth 部分的代碼寫好了,

這裡,我就分享一下我使用oAuth 1.0 api 的經驗 

整個oAuth 最麻煩的的就是建構算法體系,豆瓣在這方面是直接給了一個開源庫給我們參考

<a href="http://code.google.com/p/oauth/">http://code.google.com/p/oauth/</a>

騰訊的文檔有對整個算法的僞碼解釋,不過,我個人建議,還是下載下傳開源庫直接參考,我看了一下,國内的開放平台對簽名的算法一般都支援HAMC-SHA1,有些,例如騰訊就隻支援HMAC-SHA1,是以,我個人建議,看HMAC-SHA1算法就足夠了.我提供的開源庫在最困難的簽名算法部分都已經進行實作,是以說,可以随便使用.

好了到編碼部分:

oAuth 1.0a ,目前大部分的用oAuth 1.0 版本認證開放平台的用的版本

不過,開源庫裡面用的還是oAuth 1.0 的标準對于callback 沒有必要性的要求,是以代碼在建立oAuthconsumer時構對callback 沒有做強制要求,但是,我們現在的oAuth 1.0 在第一步中是就必須要求這個參數,我測試了一下,在騰訊開放平台中,不加callback參數是肯定通路不了,在豆瓣API中就算第一步沒要求加callback 即使加上了也沒有關系.

用PHP代碼實作 Request Token 的連結

&lt;?php   

require_once 'OAuth.php';  

$request_token_url = ‘https://open.t.qq.com/cgi-bin/request_token’;  

//從服務商擷取的  

API KEY$key = ‘xxxxxx’;  

$secret = ‘sssss’;  

$callback =’null’;   

//這個在oAuth 1.0标準中不強制要求,也是漏洞的所在,不過這個漏洞的成功率極低.. 在oAuth1.0 a 這個參數是必須的  

//生成消費方  

$consumer = new OAuthConsumer($key,$secret,$callback);  

//生成簽名用連結  

$req_token_url = OAuthRequest::from_consumer_and_token($consumer,NULL,”GET”,$request_token_url);  

//進行連結簽名  

$req_token_url-&gt;sign_request($sig_method,$consumer,NULL);  

//列印出我們的連結echo $req_token_url-&gt;to_url();  

//列印出我們的連結  

echo   

$req_token_url-&gt;to_url()  

;?&gt; 

 這裡還算比較簡單的,如果是

豆瓣的傳回資訊:

oauth_token=xxxxxxx&amp;oauth_token_secret=xxxxxxx

騰訊的傳回資訊:

oauth_token=xxxxxxx&amp;oauth_token_secret=xxxxxxx&amp;oauth_callback_confirmed=true

這裡要記住的是oauth_token_secret 記得好好儲存,因為在第三步的時候是必須的!

在第二步授權完畢後

在第三步要與授權的oauth_token組成新的消費方.

這一步比較簡單…上PHP代碼

&lt;?php       

$authorize_url = “https://open.t.qq.com/cgi-bin/authorize”;     

$oauth_token =’上一步中擷取的oauth_token’;     

//以下是可選參數,成功授權後帶參數跳轉到相應頁面,具體參見服務商   

//豆瓣&gt;     

$callback = ‘www.yourapp.com’;   

//騰訊的 $wap =’’      

//參數如有特殊字元需要urlEncode ,帶連結的請求這步是必須的   

$params = array();    

$params[‘oauth_token’]=$oauth_token;    

$params[‘callback’] = $callback;   

//根據自己的需要更改.   

//生成使用者授權連結   

$url = $authorize_url.’?”.http_build_query($params);    

echo $url;   

?&gt; 

 拷到浏覽器就會跳轉到授權頁面

豆瓣的話,就是授權成功了

騰訊的話,還帶了驗證碼,這個要認真閱讀文檔!!!!

授權成功以後,如果是oAuth 1.0 就十分友善..直接用第一步獲得的oauth_token 和 oauth_token_secret 組成一個oAuthToken 添加到第一步的那個null參數裡面就可以取得那個用于擷取access token 的連結

如果是用豆瓣的話你隻需這樣:

&lt;?php     

require_once 'OAuth.php';   

$access_token_url = ‘http://www.douban.com/service/auth/access_token’;   

//從服務商擷取的API KEY $key = ‘xxxxxx’;   

$secret = ‘sssss’;        

// 第一步中獲得的兩個參數,确認在第二步中$oauth 獲得授權以後才能夠通路成功     

$oauth = ‘xxxxx’;     

$oauth_secret = ‘xxx’;     

//生成 通路用的token   

$token = new OAuthToken($oauth,$oauth_secret);     

$consumer = new OAuthConsumer($key,$secret);  

$req_token_url = OAuthRequest::from_consumer_and_token($consumer,$token,”GET”,$request_token_url);  

$req_token_url-&gt;sign_request($sig_method,$consumer,$token);  

echo $req_token_url-&gt;to_url();  

 拷到浏覽器中,你就擷取到我們用于通路使用者資源的兩個參數oauth_token 和 oauth_token_secret,豆瓣的話還會傳回使用者的ID.

騰訊的話,記得在授權的時候加上驗證碼,一樣可以獲得

對于Access Token 的期限.

一般而言,access token 的實效一般是使用者取消授權才會失效,不過,聽說也有有時效的,這個,我得去找找是哪家

其實,這個認證各大服務商都提供了相應的SDK 讓我們非常簡單的使用他們提供的服務,隻要填上APIKEY 剩下的就是客戶授權的問題,要不是,豆瓣提供的PHP的 SDK,我準備用的空間商無法支援,我也懶得搞清楚是怎麼認證的.oAuth 1.0 應該還能用很長一段時間,不過,oAuth 2.0 才是未來(牆外的基本都用 2.0 版本),聽說,oAuth 2.0 在使用上簡單了很多,看了一下新浪的的确如此,早知道,就不用豆瓣的了…哎….晚些時候,補上一個支援oAuth 1.0&amp;1.0a 的demo,有或者直接看服務商的… 

本文轉自 liam2199 部落格,原文連結:http://blog.51cto.com/youxilua/773035   如需轉載請自行聯系原作者