OAuth 2.0不适用于服务器端web应用程序



我正试图使用Google contacts api获得gmail联系人。为此,我使用OAuth 2.0。为此,我在这里阅读了他们的OAuth 2.0使用指南。我大体上遵循了这些步骤

  1. 注册我的应用程序与谷歌和获得客户端id和客户端秘密和注册我的redirect uri与他们
  2. 现在我首先创建了一个名为sample.php的文件,如果用户点击get contacts,他将被重定向到google确认页面
  3. 现在谷歌要求确认,如果用户同意提供其联系方式,那么他将被重定向到redirect uricode
  4. 现在我提取代码并发出post请求以获得OAuth令牌,如果我获得令牌,我将对联系人发出请求。

sample.php的代码如下所示

<?php
$client_id="my client id";
$redirect_uri="http://localhost/htdocs/contacts/redirect.php";
echo <<<doc
<html>
<body>
<a href="http://accounts.google.com/o/oauth2/auth?client_id=$client_id&redirect_uri=$redirect_uri&scope=https://www.google.com/m8/feeds/&response_type=code">
get contacts
</a>
doc;
echo <<<doc
</body>
</html>
doc;
?>

redirect.php的代码如下所示

<?php
$client_id="my client id";
$client_sec="my client secret ";  
$redirect_uri="http://localhost/htdocs/contacts/redirect.php";
$code=$_GET['code'];
$post="code=$code&client_id=$client_id&client_secret=$client_sec&redirect_uri=$redirect_uri&grant_type=authorization_code";
$post=urlencode($post);
 //the following curl request is made to get the authorization token
$ch=curl_init();
$url="https://accounts.google.com/o/oauth2/token";
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_AUTOREFERER,1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
$json=curl_exec($ch);
curl_close($ch);
echo $json;     // this is showing Required parameter is missing: grant_type Error 400
$res=json_decode($json,true);
print_r($res);   // this is just for debugging
$token=$res['access_token'];
echo $token;   // this is just for debugging
$url="https://www.google.com/m8/feeds/contacts/default/full?oauth_token=$token";
  //the following curl request is made to get the contacts
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);
curl_setopt($ch,CURLOPT_AUTOREFERER,1);
$xml=curl_exec($ch);
echo $xml;
curl_close($ch);
$dom= new DOMDocument();
$dom->loadXML($xml);
$xpath=new DOMXPath($dom);
$path='//gd:email';
$nodes=$xpath->query($path);
echo $nodes->length."<br />";
foreach($nodes as $node)
{
$email=$node->attributes->getNamedItem('address')->nodeValue;
echo $email."<br />";
}
?>

现在的问题是步骤4失败了。它很顺利,直到确认步骤,当我点击Allow access时,我被重定向到我的redirect uri,但它说

所需参数缺失:grant_type Error 400

现在我不明白这一点,因为我提供了grant_type参数。我看了看firebug,发现一个帖子请求正在制作,但不是我想要的那个。正在发出的post请求是这个
https://accounts.google.com/o/oauth2/approval?xsrfsign=AC9jObYAAAAATkfm3uvx0sfsW7WVmB_FeRqVPLjDcTLz,状态显示为302 moved Temporarily。我不明白发生了什么事。他们在OAuth workflow中有什么改变吗?需要帮助


编辑如建议,但Ikke我删除了grant_type之前的空间,它工作了。现在我可以获得访问令牌,但我仍然无法获得联系人。(我得到一个错误,因为Empty string supplied as input in htdocscontactsredirect.php on line 35line 35指的是$dom->loadXML($xml);因此,似乎没有发出get请求)此外,我无法看到在firebug中发出的post请求(但肯定是因为我获得访问令牌作为响应而发出的)。我也没有看到firebug中的get请求,这是我在发布请求后做出的,有什么问题吗?


更新:问题是请求是在HTTPS上,我没有使用适当的HTTPS标头。我使用了正确的标题,它工作了。问题解决了吗?也许吧。因为我仍然不明白为什么我无法在 firebug's' net '标签

中看到那些获取和发布请求

&grant_type之间有一个空格。这可能导致google无法识别参数

"因为我仍然不明白为什么我无法在firebug的'net '选项卡中看到那些get和post请求"

我想既然你是用curl请求的东西,它与firefox无关,因为curl是一个服务器端库,因此curl生成的post不通过浏览器,firebug无法看到它们

你正在传递一个已经urlencoded的字符串给PHP的urlencode():

$post="code=$code&client_id=$client_id&client_secret=$client_sec&redirect_uri=$redirect_uri&grant_type=authorization_code";
$post=urlencode($post);

这会使值混乱,Google的服务器不能正确解析它,因此报告一个缺失的参数。删除$post=urlencode($post);行,看看是否能更好地

相关内容

  • 没有找到相关文章

最新更新