Bookmark and Share

Lee's 程序人生

HTML CSS Javascript XML AJAX ATLAS C# C++ 数据结构 软件工程 设计模式 asp.net Java 数字图象处理 Sql 数据库
  博客园  :: 首页  :: 新随笔  :: 联系 :: 管理

转:Google OAuth 简单入门与使用

Posted on 2009-12-18 20:14  analyzer  阅读(2622)  评论(0编辑  收藏  举报

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里

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.   }  

此外把params数组里的scope清理掉,豆瓣不需要。详细可以参考http://www.douban.com/service/apidoc/auth

其他基本是大同小异。豆瓣有PHP版的OAuth示例,可惜是做成ZEND FRAMEWORK的。我需要的是单个文件以便拆解到我的框架中。

接下来研究windows live的API和renren.com的API。

FROM:http://dev.meettea.com/show-53-1.html

 

/Files/analyzer/test.7z 

我要啦免费统计