看這篇博文的朋友,我建議先去了解一下什麼是 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 的連結
<?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->sign_request($sig_method,$consumer,NULL);
//列印出我們的連結echo $req_token_url->to_url();
//列印出我們的連結
echo
$req_token_url->to_url()
;?>
這裡還算比較簡單的,如果是
豆瓣的傳回資訊:
oauth_token=xxxxxxx&oauth_token_secret=xxxxxxx
騰訊的傳回資訊:
oauth_token=xxxxxxx&oauth_token_secret=xxxxxxx&oauth_callback_confirmed=true
這裡要記住的是oauth_token_secret 記得好好儲存,因為在第三步的時候是必須的!
在第二步授權完畢後
在第三步要與授權的oauth_token組成新的消費方.
這一步比較簡單…上PHP代碼
<?php
$authorize_url = “https://open.t.qq.com/cgi-bin/authorize”;
$oauth_token =’上一步中擷取的oauth_token’;
//以下是可選參數,成功授權後帶參數跳轉到相應頁面,具體參見服務商
//豆瓣>
$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;
?>
拷到浏覽器就會跳轉到授權頁面
豆瓣的話,就是授權成功了
騰訊的話,還帶了驗證碼,這個要認真閱讀文檔!!!!
授權成功以後,如果是oAuth 1.0 就十分友善..直接用第一步獲得的oauth_token 和 oauth_token_secret 組成一個oAuthToken 添加到第一步的那個null參數裡面就可以取得那個用于擷取access token 的連結
如果是用豆瓣的話你隻需這樣:
<?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->sign_request($sig_method,$consumer,$token);
echo $req_token_url->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&1.0a 的demo,有或者直接看服務商的…
本文轉自 liam2199 部落格,原文連結:http://blog.51cto.com/youxilua/773035 如需轉載請自行聯系原作者