2011-08-14 3 views
3

Google contacts api을 사용하여 gmail 연락처를 얻으려고합니다. 이를 위해 OAuth 2.0을 사용하고 있습니다. 이를 위해 나는 여기에 OAuth 2.0을 사용하는 그들의 가이드를 읽었습니다. 대체로 내가 다음 단계OAuth 2.0이 서버 측 웹 응용 프로그램에서 작동하지 않습니다.

  1. 클라이언트 ID와 클라이언트 비밀을 구글에서 내 응용 프로그램을 등록하고 취득을 따라하고 지금
  2. redirect uri 등록 내가 처음에 sample.php라는 파일을 만든 get contacts 사용자가 클릭하면 그
  3. Google에서 확인을 요청하고 사용자가 연락처 정보를 제공하기로 동의하면 redirect uri (code)으로 리디렉션됩니다.
  4. 이제 코드를 추출하고 OAuth 토큰을 얻으려는 게시물 요청을 만들고 토큰을 얻으면 연락처 요청을합니다. 이

    <?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가 실패하는 단계입니다 같은 redirect.php 보이는위한

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; 
?> 

코드처럼 보인다. 그것은 확인 단계까지 순조롭게 진행하고 내가 Allow access을 클릭하면

필수 매개 변수가 누락 난 내 redirect uri로 리디렉션하고 있지만이

말 : 400

지금 나는 내가 grant_type를 제공하고 있기 때문에 이것을 이해 해달라고 grant_type 오류 매개 변수. 나는 firebug를보고 게시물 요청이 만들어졌지만 의도 한 것이 아니라는 사실을 알게되었습니다. 제출 요청은
https://accounts.google.com/o/oauth2/approval?xsrfsign=AC9jObYAAAAATkfm3uvx0sfsW7WVmB_FeRqVPLjDcTLz이며 상태는 302 moved Temporarily입니다. 나는 무슨 일이 벌어지고 있는지 이해하지 못한다. 그들은 OAuth workflow에서 뭔가를 바꿨나요? 내가 grant_type 전에 공간을 제거하고 일 IkkeBU 편집 으로 제안 도움


이 필요합니다. 이제는 액세스 토큰을 얻을 수 있지만 여전히 연락처를 가져올 수 없습니다. (으로 오류가 발생하고 은 $dom->loadXML($xml)을 참조하므로 get 요청이 이루어지지 않은 것으로 보입니다.) 게다가 할 수 없습니다. firebug에서 게시 요청을 참조하십시오 (하지만 응답으로 액세스 토큰을 얻었 기 때문에 확실하게 만들어졌습니다). 나는 또한 요청을 볼 수 없다 firebug 나는 게시물 요청 후 무엇을 잘못 했나요?


업데이트 : 문제는 요청이 HTTPS에이었다이었다 그리고 난 HTTPS에 대한 적절한 헤더를 사용하지 않았다. 올바른 헤더를 사용했는데 제대로 작동했습니다. 문제가 해결 되었습니까? 아마도.난 아직 내가 사람들은 firebug's' net` 탭

+1

아마도 오타이지만 &와 grant_type 사이에는 공백이 있습니다. – Ikke

+0

@Ikke 감사합니다. 이제는'액세스 토큰'을 얻을 수 있지만 아직 연락 할 수는 없습니다. 연락을받을 수 있는지 알려주지. 대답으로 게시하고 받아 들일 것입니다. 다시 한 번 감사드립니다 – lovesh

+0

"연락처를 가져올 수 없음"이란 무엇을 의미합니까? – Ikke

답변

2

&grant_type 사이에 공백이 있습니다. 그러면 Google에서 매개 변수를 인식하지 못하게 될 수 있습니다.

+0

감사합니다. 내 질문에 편집을 참조하십시오. 나는 방화범에 – lovesh

+0

의 무언가에 대해 의아해했다. 내 업데이트를 참조하십시오. 감사 – lovesh

0

당신은 PHP의 urlencode()에 이미 urlencoded로 문자열을 전달하는 솜씨로 POST 요청 볼 수없는 나는 이유를 이해 해달라고 때문에 :

$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); 행을 제거하고 작동하는지 확인하십시오. .

1

, 당신은 컬 물건을 요청하는 때부터 가정

"난 아직 내가 그 얻을 및 firebug's'net` 탭에서 POST 요청 볼 수없는 나는 이유를 이해 해달라고 때문에"는 파이어 폭스와 아무 상관이있다, curl은 서버 측 라이브러리이므로 curl로 만든 POST는 브라우저를 거치지 않고 방화범이 그들을 볼 수 없습니다.

관련 문제