[英]Response from Google is different when using PHP curl vs. curl from command line
我正在嘗試將https://github.com/simon-weber/gpsoauth移植到PHP。
當我從命令行執行curl請求時,響應是預期的:
命令:
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表現不同? 我是否必須添加或刪除某些標頭?
謝謝@Paras。
這兩個請求之間的唯一區別是內容長度-curl的內容長度為80,而PHP為82。
我的密碼中有一個感嘆號,用%21
替換了http_build_query()
,而命令行上的curl
沒有。 Google似乎接受兩者,但僅在真實的情況下才發送Token
!
不是%21
。
不要使用http_build_query
,它用於查詢字符串數據,而不是application/x-www-form-urlencoded
。 !
當POST
正文的一部分時,不應進行編碼。 您可以直接將數組作為CURLOPT_POSTFIELDS
的值CURLOPT_POSTFIELDS
。 請參閱http://php.net/manual/en/function.curl-setopt.php上有關此說明的注釋。
RFC 1738說:
因此,僅字母數字,特殊字符“ $ -_。+!*'()”和用於保留目的的保留字符可以在URL中未編碼使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.