Google OAuth 简单入门与使用

红薯 发布于 2011/12/21 13:11
阅读 748
收藏 7

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。

文章出处:http://dev.meettea.com/show-53-1.html

附件: test.7z (9.1 K)

加载中
0
daijie
daijie
老大啊这个是我09年的拙作,咋好意思拿出来分享啊。改天我换个好看点的版本出来吧。
返回顶部
顶部