Использование stream_context_create для выполнения POST - результат равен false :( - PullRequest
9 голосов
/ 04 января 2012

Может быть, кто-то может указать, что я здесь делаю неправильно. Я возиться с Google API и OAuth, чтобы я мог зарегистрировать пользователей через Google для моего приложения. Я нашел PHP, который они предоставляют, довольно громоздким, поэтому решил больше попрактиковаться в выполнении запросов https и тому подобное. До сих пор у меня был некоторый успех, но последний шаг в получении токена для обмена на пользовательскую информацию требует метода POST. Простое перенаправление браузера, копирование окончательного URL-адреса методом GET возвращает ошибку. Я собираюсь начать копаться в расширении cURL дальше, но, возможно, кто-то может определить, что не так с этим кодом?

$url = "https://accounts.google.com/o/oauth2/token";
$fields = array(
    'code' => $_GET['code'],
    'client_id' => $google['clientID'],
    'client_secret' => $google['clientSecret'],
    'redirect_uri' => "http://www.qwiku.com/scripts/php/google/reg_response.php",
    'grant_type' => "authorization_code"
);

$data = http_build_query($fields);

echo $data."<br />";

$context = stream_context_create(array(
    'http' => array(
        'method' => 'POST',
        'header' => 'Content-Type: application/x-www-form-urlencoded',
        'content' => $data
    )
));

$result = file_get_contents($url, false, $context);

var_dump($result);  

Дамп результата ложен. Вы можете увидеть документацию Google здесь, но я на 99% уверен, что данные сформулированы правильно. http://code.google.com/apis/accounts/docs/OAuth2WebServer.html#formingtheurl

UPDATE

Я сейчас использую curl, и он работает. Единственная проблема - Google возвращает ошибку «invalid_grant». Не уверен, почему, поскольку он установлен точно так, как они указывают.

$url = 'https://accounts.google.com/o/oauth2/token';
$ch = curl_init($url);

curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
curl_close($ch);

Обновление 2

Я обновил весь процесс, так как я только что обновил перенаправление и бинго, он работает. Срок действия кода истек.

Ответы [ 2 ]

1 голос
/ 22 января 2016

Ваш метод выглядит хорошо,

Посмотрим, пропустил ли ты что-нибудь.


<?php
$data = http_build_query(....

$response = @file_get_contents('https://accounts.google.com/o/oauth2/token', false, stream_context_create([
'http' => [ 'method'          => 'POST'
          , 'follow_location' => true
          , 'content'         => $data
          , 'header'          => implode("\r\n", ['Accept: */*'
                                                , 'Connection: keep-alive'
                                                , 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8'
                                                , 'User-Agent: jacob']) . "\r\n"
]]));
?>
0 голосов
/ 05 сентября 2014

Вы можете попытаться использовать другой метод для этого, например, используя клиентский класс http, который предоставит вам все подобные вещи:

http://www.phpclasses.org/package/576-PHP-GET-HEAD-POST-methods-with-a-lot-of-features.html

Или попробуйте использовать класс для OAuth так, как вы хотите:

http://www.phpclasses.org/package/7700-PHP-Authorize-and-access-APIs-using-OAuth.html

Я уже реализовал это поверх Practico Framework, и у меня все отлично работает вместо использования stream_context_create.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...