Я пытаюсь передать 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 ведет себя по-другому? Нужно ли добавлять или удалять заголовок?
Не используйте http_build_query
, это для строковых данных запроса, а не application/x-www-form-urlencoded
. !
не должны быть закодированы, когда часть тела POST
. Вы можете передать массив непосредственно как значение для CURLOPT_POSTFIELDS
. См. Примечание об этом на http://php.net/manual/en/function.curl-setopt.php.
В RFC 1738 говорится:
Таким образом, только символы алфавита, специальные символы "$ -_. +! * '()," И зарезервированные символы, используемые для их зарезервированных целей, могут использоваться в незашифрованном виде в URL-адресе.
BadAuthentication
когда я использую curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
независимо от того, заменю ли я @
в своем адресе электронной почты на %40
или нет. Есть ли способ получить фактический запрос, отправленный curl
? Я читал где-то здесь, так что curl
не предоставляет возможности для этого, потому что вы сами предоставляете тело. Кстати: я на windows с xampp с php 5.6.8, но я также попробовал мой RPI
CURLOPT_POSTFIELDS
. Войдите или распечатайте свои данные, чтобы убедиться, что они не зашифрованы случайно перед входом.
Спасибо @Paras.
Единственным отличием между двумя запросами была длина контента - 80 для curl против 82 для PHP.
У меня есть восклицательный знак в моем пароле, который http_build_query()
заменяет %21
а curl
в командной строке - нет. Google, похоже, принимает оба, но только отправляет Token
если он реальный !
а не %21
.