2012-07-27 74 views
0

我正在編寫下面的代碼來獲取授權令牌。curl到google時invalid_request響應

指定授權的代碼變量

$code = $this->request->query['code']; 

我已刪除了我的客戶的祕密張貼問題。

$clientSecret = ""; 

初始化捲曲

 $ch = curl_init(); 
     $header[]   = "Content-Type: application/x-www-form-urlencoded"; 

     curl_setopt($ch, CURLOPT_HTTPHEADER,  $header); 
     curl_setopt($ch, CURLOPT_POST,  true); 
     curl_setopt($ch, CURLOPT_POSTFIELDS, urlencode("code=".$code."& 
       client_id=289710071999.apps.googleusercontent.com& 
       client_secret=".$clientSecret."& 
       redirect_uri=http://budzzflorist.localhost.com/users/google& 
       grant_type=authorization_code")); 
     curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token"); 
     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
     $request_result = curl_exec($ch); 
     print_r(curl_getinfo($ch)); 
     echo "\n\ncURL error number:" .curl_errno($ch); // print error info 
     echo "\n\ncURL error:" . curl_error($ch); 
     var_dump(json_decode($request_result,true)); 
+0

看起來您正在使用CakePHP。你應該看看['HttpSocket'](http://api.cakephp.org/class/http-socket)類。 – 2012-07-27 17:30:38

+0

我有這個選擇,但我想用捲曲來做。 – user1558329 2012-07-27 17:36:04

回答

0

它看起來像谷歌希望的形式是​​。

試試這個:

$ch   = curl_init(); 
$code   = '123'; 
$clientSecret = '45686'; 

$postFields = array('code'   => $code, 
        'client_id'  => '289710071999.apps.googleusercontent.com', 
        'client_secret' => $clientSecret, 
        'redirect_uri' => 'http://budzzflorist.localhost.com/users/google', 
        'grant_type' => 'authorization_code'); 

curl_setopt($ch, CURLOPT_POST,  true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postFields)); 
curl_setopt($ch, CURLOPT_URL, "https://accounts.google.com/o/oauth2/token"); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$request_result = curl_exec($ch); 

var_dump(json_decode($request_result,true)); 

結果:invalid_client,因爲我的令牌是不正確的,但不能invalid_request

如果將數組傳遞給CURLOPT_POSTFIELDS,cURL將強制將內容類型設置爲multipart/form-data,這會導致無效請求。而是使用http_build_query,它根據鍵值對從數組中創建一個url編碼的查詢字符串。然後將結果傳遞給CURLOPT_POSTFIELDS

+0

賓果這對我有用....... – user1558329 2012-07-27 18:15:05

0

您的來電urlencode是錯誤的。它實質上是編碼整個post參數字符串,但實際上只有值(不是鍵)應該被URL編碼。

另外,你應該考慮使用以下行,而不是你的一樣捲曲將URL編碼自動爲你的一切:

curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    'code' => $code, 
    'client_id' => $clientId, 
    'client_secret' => $clientSecret, 
    'redirect_uri' => 'http://example.org', 
    'grant_type' => 'authorization_code' 
)); 

更新:這裏是爲我工作:

請求令牌

curl_setopt_array($ch, array(
    CURLOPT_POST => false, 
    CURLOPT_POSTFIELDS => array(
    'response_type' => 'code', 
    'client_id' => $clientId, 
    'redirect_uri' => 'http://example.org/auth/google/callback', 
    'scope' => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile' 
), 
    CURLOPT_URL => 'https://accounts.google.com/o/oauth2/auth', 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_RETURNTRANSFER => true 
)); 

$request_result = curl_exec($ch); 

回調

curl_setopt_array($ch, array(
    CURLOPT_POST => true, 
    CURLOPT_POSTFIELDS => array(
    'code' => $code, 
    'client_id' => $clientId, 
    'client_secret' => $clientSecret, 
    'redirect_uri' => 'http://example.org', 
    'grant_type' => 'authorization_code' 
), 
    CURLOPT_URL => 'https://accounts.google.com/o/oauth2/token', 
    CURLOPT_SSL_VERIFYPEER => false, 
    CURLOPT_RETURNTRANSFER => true 
)); 

$request_result = curl_exec($ch); 
+0

我仍然因爲無效的請求而被拒絕 – user1558329 2012-07-27 17:44:18

+0

curl_setopt($ ch,CURLOPT_POST,true);通過在CURLOPT_POSTFIELDS下面寫下這一行,現在我得到空 – user1558329 2012-07-27 18:08:01

+0

那裏。我在Google上創建了一個應用,並測試了上面的代碼以確保它可以正常工作。 – 2012-07-27 18:26:34