簡體   English   中英

使用PHP curl和命令行curl時,來自Google的響應有所不同

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM