2017-10-15 1 views
0

Ich habe ein Problem bekommen, wenn ich access_token von OAuth2 Server bekommen habe. Ich verwende Curl in PHP die access_token zu bekommen, aber es scheiterte und zurück:curl in PHP, um access_token zu erhalten OAuth2 return error: "invalid_client"

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

Das seltsame ist, wenn ich die Locke von Eingabeaufforderung verwenden:

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 

es Erfolg und Rückkehr der access_token:

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

ich verwende Laravel 5.2 und hier ist mein Code von OAuth Server zu handhaben access_token zu erhalten:

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; 
} 

Ich habe versucht, ein anderes Skript aus dem Internet und Stackoverflow und Apache und PHP neu starten, aber es funktioniert immer noch nicht.

Gibt es eine Möglichkeit, dieses Problem zu lösen? Was soll ich überprüfen?

Vielen Dank für Ihre Hilfe und Antwort.

+0

Haben Sie versucht, grant_type in curl-Headern hinzuzufügen? –

+0

Nein. Ich habe das nicht versucht. Wie geht das? –

Antwort

0

Versuchen Sie, die Anfrage stattdessen auf curl Header zu senden.

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

Entweder schickte die grant_type auf Kopf- und dann client_secret und client_id wie Post, oder sie geschickt auf Header, die es auszuprobieren. Und übrigens. $request->code sollte überprüft werden, bevor die Anforderung zum Einrollen übergeben wird. Und alle url, client_secret, client_id müssen mit in .env sein und sie durch config/services bekommen.

+0

Ich versuche das, aber es gibt 'error: MethodNotAllowedHttpException in RouteCollection.php Zeile 218' zurück. Was meinst du mit '$ request-> code' sollte vor dem Passwing auf curl geprüft werden? Was für eine Überprüfung? Dann habe ich versucht, die 'url, client_secret, client_id' in' .env' zu setzen, ist aber immer noch gleich. Befindet sich 'config/services' auf dem OAuth-Server, nicht auf dem Client-Server. Weil mein Codefehler auf dem Client-Server nicht im OAuth-Server ist. –

+0

Wenn ich die 'url, client_secret, client_id' im' .env' setzen und sie durch 'config/services' holen muss, wie heißen die Dienste? Ist es an mir, den Service zu nennen? Und wie kann ich über die Dienste darauf zugreifen? Entschuldige meine blöde Frage, weil ich neu in OAuth2 bin. Und danke für deine Antwort. –

Verwandte Themen