2017-04-14 61 views
0

我想獲取有關Google帳戶的數據。我用下面的代碼:Google OAuth2通過cURL返回「unsupported_grant_type」(PHP)

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://www.googleapis.com/oauth2/v4/token', 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTPHEADER => [ 
     'Cache-Control: no-cache', 
     'Content-Type: application/x-www-form-urlencoded', 
    ], 
    CURLOPT_POSTFIELDS => [ 
     'code' => $code, 
     'client_id' => '{MY_CLIENT_ID}', 
     'client_secret' => '{MY_CLIENT_SECRET}', 
     'redirect_uri' => '{SOME_URL}' 
     'grant_type' => 'authorization_code', 
    ] 
)); 

$result = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

在結果我得到一個錯誤:

{ 
    "error": "unsupported_grant_type", 
    "error_description": "Invalid grant_type: " 
} 

我使用說明此:

https://developers.google.com/identity/protocols/OpenIDConnect

可變$code和另一個數據是有效的!因爲我試圖通過「PostMan」發送請求,並且我得到了正確的結果。

請告訴我,我哪裏有錯?

回答

0

嘗試這樣做,以這樣的方式

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => 'https://www.googleapis.com/oauth2/v4/token', 
    CURLOPT_POST => true, 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_POSTFIELDS => http_build_query([ 
     'code' => $code, 
     'client_id' => '{MY_CLIENT_ID}', 
     'client_secret' => '{MY_CLIENT_SECRET}', 
     'redirect_uri' => '{SOME_URL}' 
     'grant_type' => 'authorization_code', 
    ]), 
)); 

順便說一句,你可以使用

CURLOPT_VERBOSE => true, 
+0

感謝您的回答!我嘗試了你的方式,我得到了同樣的錯誤...但是!當我嘗試不同的「redirect_uri」時,我解決了我的麻煩。我不明白,爲什麼不能在參數中使用每個URI?它們都添加到我的Google App的列表中,但只有一個(不是第一個!)來自6個URI是有效的!我錯過了Google App的設置? – vitaliy

+1

我找到解決方案。順便說一句,需要設置「redirect_uri」與獲取「代碼」的第一個請求中設置的URL相同。就這樣。 P.S .:也許我錯過了來自文檔的註釋...... :( – vitaliy

0

我在C#這樣做調試卷曲的要求,並認爲我的問題可能有關。當指定redirect_url或任何其他字符串時,請確保您轉義URI,否則它會弄亂髮布請求。這是因爲請求是使用application/x-www-form-urlencoded類型發送的。