2014-11-16 152 views
3

我已經使用Google日曆API構建了一個原型日曆同步系統,並且除了刷新訪問令牌之外,它運行良好。這些是我經歷的步驟:Google OAuth2錯誤 - 缺少必需的參數:刷新時的grant_type

1)授權我的API並收到授權碼。

2)交換了Access Token和RefreshToken的授權碼。

3)使用日曆API,直到訪問令牌過期。

此時我嘗試使用刷新令牌獲得另一個訪問令牌,所以我的用戶不必保持授予訪問權限,因爲日誌同步在離線時發生。

下面是PHP代碼,我在整個系統中使用了curl請求。

$requestURL = "https://accounts.google.com/o/oauth2/token"; 
$postData = array("grant_type" => "refresh_token", 
        "client_id" => $clientID,  
        "client_secret" => $clientSecret, 
        "refresh_token" => $refreshToken); 

$headers[0] = 'Content-Type: application/json'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_URL, $requestURL); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($postData)); 

$response = curl_exec($ch); 
$responseArray = json_decode($response, TRUE); 

我得到的迴應是:

[error] => invalid_request 
[error_description] => Required parameter is missing: grant_type 

沒有捲曲的錯誤報告。

我試過頭內容類型:應用程序/ x-www-form-urlencoded,和許多其他的東西,具有相同的結果。

我懷疑這是在我的curl設置或標題中顯而易見的,因爲在Google文檔中爲此請求提及的每個參數都已設置。不過,我正在圍繞着周圍的環境,希望得到任何幫助,包括指出我忽略的任何明顯錯誤。

回答

5

您的要求不應該張貼JSON數據,而是查詢形式編碼的數據,如:

$requestURL = "https://accounts.google.com/o/oauth2/token"; 
$postData = "grant_type=refresh_token&client_id=$clientID&client_secret=$clientSecret&refresh_token=$refreshToken"; 

$headers[0] = 'Content-Type: application/x-www-form-urlencoded'; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
curl_setopt($ch, CURLOPT_URL, $requestURL); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); 

$response = curl_exec($ch); 
$responseArray = json_decode($response, TRUE); 
+0

感謝您的回答。試圖用相同的結果錯誤。 –

+0

請仔細檢查:剛纔驗證此確切的代碼,並將其返回:數組 ( [的access_token] =><> [token_type] =>承載 [expires_in] => 3600 [id_token] =><> ) –

+0

它不僅僅是內容類型的改變,它也是postData本身,它不能是json_encode'd –

相關問題