Ответ от Google отличается при использовании PHP curl против curl из командной строки

1

Я пытаюсь передать https://github.com/simon-weber/gpsoauth в PHP.

Когда я делаю запрос на завивки из командной строки, ответ будет таким, как ожидалось:

Команда:

curl "https://android.clients.google.com/auth" --data "Email=<EMAIL>&Passwd=<PASSWD>&service=ac2dm&add_account=1"

Отклик:

SID=BAD_COOKIE
LSID=BAD_COOKIE
Auth=DQAAABEB....
services=mail,talk,ig,writely,reader...
Email=...
Token=oauth2rt_1/...
GooglePlusUpgrade=0
firstName=...
lastName=...

Однако, когда я пытаюсь сделать тот же вызов из PHP curl, Token отсутствует.

Код:

$data = [
    'Email' => $email,
    'add_account' => 1,
    'Passwd' => $passwd,
    'service' => 'ac2dm',
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://android.clients.google.com/auth');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$response = curl_exec($ch);
curl_close($ch);

Отклик:

SID=BAD_COOKIE
LSID=BAD_COOKIE
Auth=DQAAABEB....
services=mail,talk,ig,writely,reader...
Email=...
GooglePlusUpgrade=0
firstName=...
lastName=...

Я попытался использовать file_get_contents и даже shell_exec, но результат тот же. Google принимает мои учетные данные, но не отправляет Token

Почему PHP Curl ведет себя по-другому? Нужно ли добавлять или удалять заголовок?

  • 1
    Включите подробную опцию (-v и CURLOPT_VERBOSE) и посмотрите, есть ли разница в запросе.
Теги:
curl
google-play-services

2 ответа

0
Лучший ответ

Не используйте http_build_query, это для строковых данных запроса, а не application/x-www-form-urlencoded. ! не должны быть закодированы, когда часть тела POST. Вы можете передать массив непосредственно как значение для CURLOPT_POSTFIELDS. См. Примечание об этом на http://php.net/manual/en/function.curl-setopt.php.

В RFC 1738 говорится:

Таким образом, только символы алфавита, специальные символы "$ -_. +! * '()," И зарезервированные символы, используемые для их зарезервированных целей, могут использоваться в незашифрованном виде в URL-адресе.

  • 0
    Я получаю BadAuthentication когда я использую curl_setopt($ch, CURLOPT_POSTFIELDS, $data); независимо от того, заменю ли я @ в своем адресе электронной почты на %40 или нет. Есть ли способ получить фактический запрос, отправленный curl ? Я читал где-то здесь, так что curl не предоставляет возможности для этого, потому что вы сами предоставляете тело. Кстати: я на windows с xampp с php 5.6.8, но я также попробовал мой RPI
  • 0
    Вам не нужно кодировать какие-либо данные перед передачей их в качестве значения для CURLOPT_POSTFIELDS . Войдите или распечатайте свои данные, чтобы убедиться, что они не зашифрованы случайно перед входом.
Показать ещё 7 комментариев
0

Спасибо @Paras.

Единственным отличием между двумя запросами была длина контента - 80 для curl против 82 для PHP.

У меня есть восклицательный знак в моем пароле, который http_build_query() заменяет %21 а curl в командной строке - нет. Google, похоже, принимает оба, но только отправляет Token если он реальный ! а не %21.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню