MeetTea需要能够通过Google API来获取用户的用户名和头像,效果就像google.org.cn的排队系统。

那么如何实现呢? 通过几天的学习、研究,下载google的源码,最后了解了原理并制作了一个简单的DEMO。

效果见附件,只有一个简单的test.php,需要自己去申请CONSUMER_KEY和CONSUMER_SECRET,不过申请步骤简单。

 

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里



PHP代码


  1. public function to_header($realm='') {/*{{{*/  
  2.   $out ='Authorization: OAuth realm="' . $realm . '"';   
  3.   $total = array();   
  4.      
  5.   /*  
  6.   $sig = $this->parameters['oauth_signature'];    
  7.   unset($this->parameters['oauth_signature']);   
  8.   uksort($this->parameters, 'strnatcmp');    
  9.   $this->parameters['oauth_signature'] = $sig;  
  10.   */  
  11.      
  12.   foreach ($this->parameters as $k => $v) {   
  13.     if (substr($k, 0, 5) != "oauth") continue;   
  14.     //$out .= OAuthUtil::urlencodeRFC3986($k) . '="' . OAuthUtil::urlencodeRFC3986($v) . '", ';   
  15.  $out .= ',' . $k . '="' . $v . '"';   
  16.     $str = $k . '=' . $v;   
  17.     if ($this->string == null) {   
  18.       $this->string = $str;   
  19.     } else {   
  20.       $this->string .= '&' . $str;   
  21.     }   
  22.   }