MeetTea需要能夠通過Google API來獲取用戶的用戶名和頭像,效果就像google.org.cn的排隊系統。
那么如何實現呢? 通過幾天的學習、研究,下載google的源碼,最后了解了原理並制作了一個簡單的DEMO。
效果見附件,只有一個簡單的test.php,需要自己去申請CONSUMER_KEY和CONSUMER_SECRET,不過申請步驟簡單。
申請地址:herehttps://www.google.com/accounts/ManageDomains
目前僅使用HMAC-SHA1算法。此外可以參考這個http://googlecodesamples.com/oauth_playground/ 有源碼,是PHP的。
詳細的技術文檔在這里 http://code.google.com/apis/accounts/docs/OAuth_ref.html
OAuth驗證第一步:Get a Request Token
這個Request Token是請求一個令牌,來允許程序接入google的服務。
具體做法是發送一個HTTP GET請求到https://www.google.com/accounts/OAuthGetRequestToken
並且在HTTP頭里有一個Authorization字段,字段里的內容是OAuth開頭,加一個空格,然后是每個參數join一個“,”和空格。
此外google的OAuth還有一個SCOPE參數,這個不是標准OAuth里的。
最后注意端口是443,不然會收到一個302;如果程序有問題會收到一個400。
如果是200,則在返回的HTTP BODY里取得$oauth_token,$oauth_token_secret
保存好這兩個值,下兩步要用到。
第二步是用戶操作部分,需要用戶授權應用訪問GOOGLE相關服務。也就是redirect到 www.google.com/accounts/OAuthAuthorizeToken?oauth_token=剛才的KEY
獲取用戶的頭像、用戶名的scope是http://www-opensocial.googleusercontent.com/api/people/@me
用戶允許Access后就會跳轉回剛才的頁面,並且在URL參數里多了一個參數。
第三步是憑剛才URL里驗證的參數發送一個GET請求到https://www.google.com/accounts/OAuthGetAccessToken
獲取接入GOOGLE服務的權限,HEADER里仍舊要包含Authorization字段。
得到KEY和SECRET后替換剛才一開始的KEY和SECRET,發送GET請求到 獲取用戶的頭像、用戶名的scope,就可以保存下來,用戶也無需注冊了。
當然,GOOGLE龐大的API還可以幫助你得到用戶朋友的EMAIL地址之類的,就看網站的需要了,潛力無限。
豆瓣用的也是OAuth。
==============2009/11/25 update=====================
豆瓣的算法和google的略有不同,主要是在http header里的數據不用rawurlencode
請搜索test.php里
- public function to_header($realm='') {/*{{{*/
- $out ='Authorization: OAuth realm="' . $realm . '"';
- $total = array();
- /*
- $sig = $this->parameters['oauth_signature'];
- unset($this->parameters['oauth_signature']);
- uksort($this->parameters, 'strnatcmp');
- $this->parameters['oauth_signature'] = $sig;
- */
- foreach ($this->parameters as $k => $v) {
- if (substr($k, 0, 5) != "oauth") continue;
- //$out .= OAuthUtil::urlencodeRFC3986($k) . '="' . OAuthUtil::urlencodeRFC3986($v) . '", ';
- $out .= ',' . $k . '="' . $v . '"';
- $str = $k . '=' . $v;
- if ($this->string == null) {
- $this->string = $str;
- } else {
- $this->string .= '&' . $str;
- }
- }
此外把params數組里的scope清理掉,豆瓣不需要。詳細可以參考http://www.douban.com/service/apidoc/auth
其他基本是大同小異。豆瓣有PHP版的OAuth示例,可惜是做成ZEND FRAMEWORK的。我需要的是單個文件以便拆解到我的框架中。
接下來研究windows live的API和renren.com的API。
本文采用Creative Commons協議,復制本文需遵守三點:1、保留署名(鏈接);2、非商業性使用;3、再次創作的作品必須以相同的許可協議發布。法律顧問:庄毅雄律師
