2011-08-14 24 views
3

gmail連絡先をGoogle contacts apiで取得しようとしています。このため私はOAuth 2.0を使用しています。このため私はここでOAuth 2.0を使用するためのガイドを読んでいます。大まかに言えば、私はこれらの手順OAuth 2.0がサーバー側Webアプリケーションで機能していません

  1. がGoogleと私のアプリを登録して、秘密のクライアントIDとクライアントを取得し、その後、私のredirect uri今私は、最初のユーザーは、彼がget contactsをクリックした場合どのsample.phpと呼ばれるファイルを作成し
  2. 彼らと登録しましたGoogle確認ページにリダイレクトされます
  3. Googleは確認を求め、ユーザーが連絡先の詳細を提供することに同意すると、彼はにcodeでリダイレクトされます。
  4. 私はコードを抽出し、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エンコード文字列を渡している

+1

おそらくタイプミスですが、&とgrant_typeの間にスペースがあります。 – Ikke

+0

@Ikkeありがとうございました。今私は 'アクセストークン'を得ることができますが、まだ連絡先は取得できません。私も連絡先を取得する場合は見てみましょう。答えとして投稿し、私はそれを受け入れるとマークします。ありがとうございました – lovesh

+0

「連絡先を取得できません」とはどういう意味ですか? – Ikke

答えて

2

&grant_typeの間にスペースがあります。それは、Googleがパラメータを認識しないようにする可能性があります。

+0

ありがとうございます。私の質問の編集を見てください。私は 'firebug'の何かについて困惑しました – lovesh

+0

その出来事。私の更新を見てください。ありがとう – lovesh

0

firebug's' net`タブで、私はそれらを見ることができません理由を理解しないとPOSTリクエストので、 Googleのサーバーが正しく解析できないため、欠落しているパラメータが報告されます。 $post=urlencode($post);行を削除し、動作するか確認してください。

1

、あなたはカールとのものを要求しているので、私が想定し

「私はまだ私はそれらを取得し、firebug's'net`タブでPOSTリクエストを参照することができません理由を理解しないので、」それは、Firefoxとは何の関係もありません、 curlはサーバー側のライブラリであるため、curlで作成されたPOSTはブラウザを経由せず、Firebugはそれらを見ることができません。

関連する問題