OAuth 2.0 не работает для веб-приложения на стороне сервера - PullRequest
3 голосов
/ 14 августа 2011

Я пытаюсь получить gmail контакты, используя Google contacts api.Для этого я использую OAuth 2.0.Для этого я прочитал руководство по использованию OAuth 2.0 здесь.В общих чертах я выполнил следующие действия:

  1. Зарегистрируйте мое приложение в Google и получите идентификатор клиента и его секретный ключ и зарегистрировали мои redirect uri с ними
  2. Теперь я сначала создал файл с именем sample.php на котором, если пользователь нажимает get contacts, он перенаправляется на страницу подтверждения Google
  3. Теперь Google запрашивает подтверждение, и если пользователь согласен предоставить свои контактные данные, он перенаправляется на redirect uri сcode.
  4. Теперь я извлекаю код и отправляю запрос на публикацию, чтобы получить токен 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 и обнаружил, что делается запрос к почте, но не тот, который я намеревался.отправляемый почтовый запрос выглядит так:
https://accounts.google.com/o/oauth2/approval?xsrfsign=AC9jObYAAAAATkfm3uvx0sfsW7WVmB_FeRqVPLjDcTLz, а статус говорит: 302 moved Temporarily.Я не понимаю, что происходит.они что-то изменили в OAuth workflow?Нужна помощь


Редактировать Как и предполагалось, bu Ikke Я удалил пробел до grant_type, и это сработало.Теперь я могу получить токен доступа, но по-прежнему не могу получить контакты. ( Я получаю сообщение об ошибке, так как Empty string supplied as input in htdocs\contacts\redirect.php on line 35 и line 35 относятся к $dom->loadXML($xml); похоже, запрос на получение не выполняется) Более того, я не могу видеть запрос на публикацию в firebug (но, конечно, он выполняется, потому что я получаю маркер доступа в качестве ответа).я также не вижу запрос на получение в firebug, который я делаю после почтового запроса, что не так?


Обновление: проблема заключалась в том, что запрос был на https, а я не былиспользуя соответствующие заголовки для https.Я использовал правильные заголовки, и это сработало. Проблема решена?Может быть.Потому что я до сих пор не понимаю, почему я не вижу эти запросы на получение и публикацию на вкладке firebug's' net`

Ответы [ 3 ]

2 голосов
/ 14 августа 2011

Между & и grant_type есть пробел. Это может привести к тому, что Google не распознает параметр.

1 голос
/ 23 ноября 2011

"Поскольку я до сих пор не понимаю, почему я не могу увидеть эти запросы получения и публикации во вкладке 'net` в firebug"

Я полагаю, поскольку вы запрашиваете вещи с помощью curl, это не имеет ничего общего с firefox, поскольку curl является библиотекой на стороне сервера, поэтому POST, сделанные curl, не проходят через браузер, и firebug не может их видеть.

0 голосов
/ 14 августа 2011

Вы передаете уже кодированную строку в 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); и посмотрите, работает ли она лучше .

...