gmail
連絡先をGoogle contacts api
で取得しようとしています。このため私はOAuth 2.0
を使用しています。このため私はここでOAuth 2.0
を使用するためのガイドを読んでいます。大まかに言えば、私はこれらの手順OAuth 2.0がサーバー側Webアプリケーションで機能していません
- がGoogleと私のアプリを登録して、秘密のクライアントIDとクライアントを取得し、その後、私の
redirect uri
今私は、最初のユーザーは、彼がget contacts
をクリックした場合どのsample.php
と呼ばれるファイルを作成し - 彼らと登録しましたGoogle確認ページにリダイレクトされます
- Googleは確認を求め、ユーザーが連絡先の詳細を提供することに同意すると、彼はに
code
でリダイレクトされます。 - 私はコードを抽出し、OAuthトークンを取得するための投稿要求を行い、トークンを取得したら連絡先を要求します。
sample.php
のコードが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 />";
}
?>
のように見えるこの
<?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;
?>
のように見える今の問題は、ステップ4が失敗したということです。それを確認ステップまでうまくいくと私はAllow access
をクリックしたときに私は私のredirect uri
にリダイレクトしていますが、その言っ
必要なパラメータが不足している:私はgrant_type
を提供していますので、grant_typeエラー400
は今、私はこれを理解しませんパラメータ。私はfirebug
を見て、投稿要求が行われているが、私が意図したものではないことを知った。投稿要求は
https://accounts.google.com/o/oauth2/approval?xsrfsign=AC9jObYAAAAATkfm3uvx0sfsW7WVmB_FeRqVPLjDcTLz
であり、状況は302 moved Temporarily
と表示されます。私は何が起こっているのか分かりません。彼らはOAuth workflow
の何かを変えましたか?提案府のようにいくつかの助け
編集 が必要Ikke私はgrant_type
の前にスペースを削除し、それが働きました。今すぐアクセストークンを取得できますが、連絡先を取得できません。()Empty string supplied as input in htdocs\contacts\redirect.php on line 35
というエラーが表示され、$dom->loadXML($xml)
を参照するとline 35
が表示されるので、取得リクエストが行われていないようです。)さらに、 firebug
のポストリクエストを参照してください(ただし、私は応答としてアクセストークンを取得しているため、確かにそのメーリングリストが作成されています)。私もfirebug
のリクエストを受け取っていないのですが、投稿後に何が間違っているのですか?
更新: 問題は要求がhttpsにあったと私はhttpsのための適切なヘッダを使用していなかったということでした。私は正しいヘッダーを使用し、それは働いた。問題は解決した?多分。、
$post="code=$code&client_id=$client_id&client_secret=$client_sec&redirect_uri=$redirect_uri&grant_type=authorization_code";
$post=urlencode($post);
これは値を台無しに:私はまだあなたがPHPのurlencode()に既にURLエンコード文字列を渡している
おそらくタイプミスですが、&とgrant_typeの間にスペースがあります。 – Ikke
@Ikkeありがとうございました。今私は 'アクセストークン'を得ることができますが、まだ連絡先は取得できません。私も連絡先を取得する場合は見てみましょう。答えとして投稿し、私はそれを受け入れるとマークします。ありがとうございました – lovesh
「連絡先を取得できません」とはどういう意味ですか? – Ikke