前言
看這篇博文的朋友,我建議先去了解一下什么是 oAuth 1.0 & 2.0的認證,對於,一些很基本的概念,各大提供該認證的網站應該說的很清楚了,這篇博文是比較細的說下,在oAuth 認證時遇到的問題,以及整個認證客戶端api調用的過程
我說下,目前我知道的提供oAuth 認證的網站(牆外的這里就不提了),大家如果想補充的話,我非常歡迎.
oAuth 1.0 || 1.0a
豆瓣
http://www.douban.com/service/
騰訊
360開發者平台
網易開放平台
搜狐開放平台
oAuth 2.0
新浪微博
百度鏈接
人人網
360開發者平台
以上是我知道是使用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 的經驗
第一步: 獲取未授權的Request Token
整個oAuth 最麻煩的的就是構建算法體系,豆瓣在這方面是直接給了一個開源庫給我們參考
http://code.google.com/p/oauth/
騰訊的文檔有對整個算法的偽碼解釋,不過,我個人建議,還是下載開源庫直接參考,我看了一下,國內的開放平台對簽名的算法一般都支持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(); //進行鏈接簽名 $req_token_url->sign_request($sig_method,$consumer,NULL); //打印出我們的鏈接 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組成新的消費方.
第二步:請求用戶授權Request 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; ?>拷到瀏覽器就會跳轉到授權頁面
豆瓣的話,就是授權成功了
騰訊的話,還帶了驗證碼,這個要認真閱讀文檔!!!!
第三步:使用授權后的Request Token換取Access Token
授權成功以后,如果是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,有或者直接看服務商的…