2017-10-15 6 views
0

J'ai eu un problème lors de l'obtention access_token de OAuth2 Server. J'utilise boucle en PHP pour obtenir le access_token, mais il a échoué et retour:curl en PHP pour obtenir access_token OAuth2 erreur de retour: "invalid_client"

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

L'étrange est, si j'utilise la boucle d'invite de commande:

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 

son succès et de retourner le access_token:

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

J'utilise Laravel 5.2 et voici mon code pour gérer de OAuth Server pour obtenir 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; 
} 

J'ai essayé un autre script d'Internet et de stackoverflow et redémarrer Apache et PHP, mais cela ne fonctionne toujours pas.

Est-il possible de résoudre ce problème? Que dois-je vérifier?

Nous vous remercions de votre aide et de votre réponse.

+0

avez-vous essayé d'ajouter grant_type sur les en-têtes curl? –

+0

Non, je n'ai pas essayé celui-là. Comment faire ça? –

Répondre

0

Essayez à la place d'envoyer la requête sur les en-têtes curl.

$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); 

soit envoyé le grant_type sur les en-têtes, puis client_secret et client_id comme poste, ou les a envoyés en-têtes essayer. Et btw. $request->code doit être vérifié avant de passer à la demande curl. Et tous les url, client_secret, client_id DOIVENT être avec .env et les obtenir par config/services.

+0

Je l'ai essayé, mais il renvoie 'error: MethodNotAllowedHttpException dans la ligne 218' de RouteCollection.php. Que voulez-vous dire à propos de '$ request-> code' devrait être vérifié avant de passer à curl? Quel genre de vérification? Ensuite, j'ai essayé de définir le 'url, client_secret, client_id' dans' .env' mais est toujours le même. Est-ce que 'config/services' est dans le serveur OAuth, pas dans le serveur client. Parce que mon erreur de code sur le serveur client n'est pas dans le serveur OAuth. –

+0

Si je dois mettre le 'url, client_secret, client_id' dans' .env' et les obtenir par 'config/services', quel est le nom des services? Est-ce à moi de nommer le service? Et comment puis-je y accéder à partir des services? Désolé pour ma question stupide parce que je suis nouveau dans OAuth2. Et merci pour votre réponse. –