2017-10-15 202 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中的新成员。并感谢您的回答。 –