2017-10-15 43 views
0

從OAuth2服務器獲取access_token時出現問題。我使用捲曲的PHP拿到的access_token,但是失敗了,返回:curl PHP獲取access_token OAuth2返回錯誤:「invalid_client」

error: "invalid_client", 
error_description: "Client authentication failed." 

奇怪的是,如果我使用命令提示符捲曲:

curl -d "client_id=f3d259ddd3ed8ff3843839b&client_secret=4c7f6f8fa93d59c45502c0ae8c4a95b&redirect_uri=http://application.dev/oauth/handle&grant_type=authorization_code&code=rZCQQBXVSQqKi2IRro1gYkSsRhyUcLsNODACjwPw" http://oauth-server.dev/oauth/access_token 

它的成功並返回的access_token:

"access_token":"fI7APDRZygrsF1BiegAQCS1yUT8vnm1LgD5bIu2U", 
"token_type":"Bearer", 
"expires_in":3600 

我使用Laravel 5.2,這裏是我的代碼從OAuth的服務器來處理得到的access_token:

public function getOAuthHandle(Request $request){ 
    $url = 'http://oauth-server.dev/oauth/access_token'; 
    $code = $request->code; 
    $client_id = 'f3d259ddd3ed8ff3843839b'; 
    $client_secret = '4c7f6f8fa93d59c45502c0ae8c4a95b'; 
    $redirect_uri = 'http://application.dev/oauth/handle'; 

    $clienttoken_post = array(
       "code" => $code, 
       "client_id" => $client_id, 
       "client_secret" => $client_secret, 
       "redirect_uri" => $redirect_uri, 
       "grant_type" => "authorization_code" 
      ); 

      $curl = curl_init($url); 

      curl_setopt($curl, CURLOPT_POST, true); 
      curl_setopt($curl, CURLOPT_POSTFIELDS, $clienttoken_post); 
      curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY); 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); 
      curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 

      $json_response = curl_exec($curl); 
      curl_close($curl); 

      return $json_response; 
} 

我試圖從互聯網和stackoverflow另一個腳本,並重新啓動Apache和PHP,但它仍然無法正常工作。

有什麼辦法可以解決這個問題嗎?我應該檢查什麼?

謝謝你的幫助和解答。

+0

您是否嘗試在捲曲標題上添加grant_type? –

+0

不,我沒有嘗試過。怎麼做? –

回答

0

嘗試在捲曲標頭上發送請求。

$curl = \curl_init(); 

    \curl_setopt_array($curl, array(
     CURLOPT_URL => $url, 
     CURLOPT_RETURNTRANSFER => true, 
     CURLOPT_ENCODING => "", 
     CURLOPT_MAXREDIRS => 10, 
     CURLOPT_TIMEOUT => 600, 
     CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
     CURLOPT_HTTPHEADER => $clienttoken_post, 
     CURLINFO_HEADER_OUT => true, 
    )); 

    $response = \curl_exec($curl); 

無論是發送標題上的grant_type然後client_secretclient_id作爲後,或送他們頭試試。順便說一句。在傳遞curl請求之前應該檢查$request->code。並且所有的url, client_secret, client_id都必須在.env中並且通過config/services得到它們。

+0

我嘗試過,但它返回RouteCollection.php行218'錯誤:MethodNotAllowedHttpException。在傳遞curl之前,你應該檢查'$ request-> code'是什麼意思?什麼樣的檢查?然後,我嘗試在'.env'中設置'url,client_secret,client_id',但仍然是一樣的。 'config/services'在OAuth服務器中,而不在客戶端服務器中。因爲我的客戶端服務器上的代碼錯誤不在OAuth服務器中。 –

+0

如果我必須在'.env'中設置'url,client_secret,client_id'並通過'config/services'獲取它們,那麼服務的名稱是什麼?命名該服務是否由我來決定?我如何從服務中訪問它們?對於我的愚蠢問題感到抱歉,因爲我是OAuth2中的新成員。並感謝您的回答。 –

相關問題