我正在尝试使用Google联系人API获取Gmail联系人。为此,我使用了OAuth 2.0。我在这里阅读了他们关于使用OAuth 2.0的指南,并广泛地遵循了以下步骤:
现在的问题是第四步失败了。它一直进行到确认步骤,但当我点击“允许访问”时,我被重定向到我的“重定向URI”,但它显示“必需参数缺失:grant_type 错误400”。
现在我不明白这是为什么,因为我提供了“grant_type”参数。我查看了“firebug”,发现正在进行一个POST请求,但不是我想要的那个。正在进行的POST请求是:
编辑:根据Ikke的建议,我去掉了“grant_type”前面的空格,然后它就起作用了。现在我可以获取访问令牌,但仍然无法获取联系人(我会收到一个错误,如“htdocs\contacts\redirect.php的第35行输入为空字符串”),因此似乎没有进行GET请求。此外,我也无法在“firebug”中看到正在进行的POST请求(但肯定正在进行,因为我得到了访问令牌作为响应)。我也看不到我在POST请求之后进行的GET请求,出了什么问题?
更新:问题是请求使用https,并且我没有使用适当的https标头。我使用了正确的标头,它起作用了。问题解决了吗?也许吧。因为我仍然不明白为什么无法在“firebug”的“net”选项卡中看到那些GET和POST请求。
- 使用Google注册我的应用程序并获取客户端ID和客户端密钥,然后将我的重定向URI注册到其中。
- 现在,我首先创建了一个名为sample.php的文件,如果用户点击“获取联系人”,则会重定向到Google确认页面。
- 现在,Google要求进行确认,如果用户同意提供其联系人详细信息,则会将其重定向到带有代码的重定向URI。
- 现在,我提取代码并发出POST请求以获取OAuth令牌,如果我获得令牌,则会请求联系人。
<?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 />";
}
?>
现在的问题是第四步失败了。它一直进行到确认步骤,但当我点击“允许访问”时,我被重定向到我的“重定向URI”,但它显示“必需参数缺失:grant_type 错误400”。
现在我不明白这是为什么,因为我提供了“grant_type”参数。我查看了“firebug”,发现正在进行一个POST请求,但不是我想要的那个。正在进行的POST请求是:
https://accounts.google.com/o/oauth2/approval?xsrfsign=AC9jObYAAAAATkfm3uvx0sfsW7WVmB_FeRqVPLjDcTLz
,状态显示为“302暂时移动”。我不明白发生了什么。他们在“OAuth工作流程”中改变了什么吗?需要一些帮助。编辑:根据Ikke的建议,我去掉了“grant_type”前面的空格,然后它就起作用了。现在我可以获取访问令牌,但仍然无法获取联系人(我会收到一个错误,如“htdocs\contacts\redirect.php的第35行输入为空字符串”),因此似乎没有进行GET请求。此外,我也无法在“firebug”中看到正在进行的POST请求(但肯定正在进行,因为我得到了访问令牌作为响应)。我也看不到我在POST请求之后进行的GET请求,出了什么问题?
更新:问题是请求使用https,并且我没有使用适当的https标头。我使用了正确的标头,它起作用了。问题解决了吗?也许吧。因为我仍然不明白为什么无法在“firebug”的“net”选项卡中看到那些GET和POST请求。