2016-12-28 2 views
1

Ich habe untersucht, einige Daten von Livecoding.tv zu greifen, und ich verwende derzeit meine Oauth2-Controller, die ich für die Twitch-API verwendet, die ziemlich einfach sein sollte.Guzzle und Form + Basic Auth Probleme mit Laravel

Wenn jemand nicht weiß, der Fluss von Oauth verwendet wird, ist der folgende:

  1. Redirect Benutzer an Dritte Oauth Verbindung mit Ihrem App-Code.

  2. Benutzer autorisiert.

  3. Benutzer auf Ihre Website umgeleitet erneut, mit einem autorisierten Token, dass Sie dann an den Dritten veröffentlichen können Ihre Aktualisierungs-Token usw.

nun auf Schritt 3 Ich laufe in einige zu bekommen Probleme. Hier ist die Beschreibung und Beispiel durch den Entwickler:

Erste token: https://www.livecoding.tv/o/token/

Kopf

Ein HTTP Basic Auth, mit der application_code als Benutzername und application_secret als Passwort, wie gesehen in das Beispiel unten.

POST Körper

code=EXAMPLE Token gotten from redirect 
grant_type=Your grant type (authorization_type) 
redirect_uri=Your redirect URL 

Und hier ist ein Beispiel cURL Anfrage aus der Dokumentation eines Arbeits curl Anfrage.

curl -X POST -d "grant_type=authorization_code&code=Php4iJpXGpDT8lCqgBcbfQ2yzhB0Av&client_id=vCk6rNsC&redirect_uri=http://localhost/externalapp" -u"vCk6rNsC:sfMxcHUuNnZ" https://www.livecoding.tv/o/token/ 

Also habe ich versucht, diese in Postman (https://www.getpostman.com/) zu machen, die aus dem Kasten heraus gearbeitet, ich fragte dann Postman dies zu PHP zu konvertieren, um zu sehen, ob ich etwas verpasst hatte. Hier ist das Ergebnis der Arbeit Postman Anfrage:

<?php 

$curl = curl_init(); 

curl_setopt_array($curl, array(
    CURLOPT_URL => "https://www.livecoding.tv/o/token/", 
    CURLOPT_RETURNTRANSFER => true, 
    CURLOPT_ENCODING => "", 
    CURLOPT_MAXREDIRS => 10, 
    CURLOPT_TIMEOUT => 30, 
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, 
    CURLOPT_CUSTOMREQUEST => "POST", 
    CURLOPT_POSTFIELDS => "code=SOMECODE&client_id=SOMECLIENTID&redirect_uri=SOMEURL&grant_type=authorization_code", 
    CURLOPT_HTTPHEADER => array(
    "authorization: Basic U09NRVVTRVI6U09NRVBBU1NXT1JE", 
    "cache-control: no-cache", 
    "content-type: application/x-www-form-urlencoded", 
    "postman-token: c8df4bbc-cbd0-73eb-df35-80210989db33" 
), 
)); 

$response = curl_exec($curl); 
$err = curl_error($curl); 

curl_close($curl); 

if ($err) { 
    echo "cURL Error #:" . $err; 
} else { 
    echo $response; 
} 

Ich war ziemlich glücklich, das sofort ausgearbeitet, so dass ich brauche nur einen Guzzle Client macht das Gleiche tun, die bereits für die Twitch Oauth arbeitet, ist hier mein Code dafür:

{ 
      $providers = ServiceProvider::findOrFail(2); 
      $client = new Client([ 
       'base_uri' => $providers->oauth_url . '/token/', 
       'form_params' => [ 
        'code' => $token, 
        'grant_type' => 'authorization_code', 
        'client_id' => $providers->application_code, 
        'redirect_uri' => $providers->redirection_url 
       ], 
       'auth' => [ 
        'somestring', 
        'someotherstring', 
       ], 
       'headers' => [ 
        'Content type' => 'application/x-www-form-urlencoded', 
        'cache-control' => 'no-cache' 
       ] 
      ]); 
      $response = $client->request('POST'); 
      return ($response); 
     } 

Dies würde zurückkehren mich nur mit einem 401, so habe ich beschlossen, einige Debug zu tun, und hier ist die Anforderung, die kommt, wenn ich es halten direkt vor dem Senden:

Client {#637 ▼ 
    -config: array:10 [▼ 
    "base_uri" => Uri {#676 ▼ 
     -scheme: "https" 
     -userInfo: "" 
     -host: "www.livecoding.tv" 
     -port: null 
     -path: "/o/token/" 
     -query: "" 
     -fragment: "" 
    } 
    "form_params" => array:4 [▼ 
     "code" => "SOMECODE" 
     "grant_type" => "authorization_code" 
     "client_id" => "SOMECLIENTID" 
     "redirect_uri" => "http://REDIRECTURI" 
    ] 
    "auth" => array:2 [▼ 
     0 => "SOMECLIENTID" 
     1 => "SOMECLIENTSECRET" 
    ] 
    "headers" => array:3 [▼ 
     "Content type" => "application/x-www-form-urlencoded" 
     "cache-control" => "no-cache" 
     "User-Agent" => "GuzzleHttp/6.2.1 curl/7.26.0 PHP/5.6.27-1~dotdeb+7.1" 
    ] 
    "handler" => HandlerStack {#664 ▼ 
     -handler: Closure {#671 ▼ 
     class: "GuzzleHttp\Handler\Proxy" 
     parameters: {▼ 
      $request: {▼ 
      typeHint: "Psr\Http\Message\RequestInterface" 
      } 
      $options: {▼ 
      typeHint: "array" 
      } 
     } 
     use: {▼ 
      $default: Closure {#669 ▼ 
      class: "GuzzleHttp\Handler\Proxy" 
      parameters: {▼ 
       $request: {▼ 
       typeHint: "Psr\Http\Message\RequestInterface" 
       } 
       $options: {▼ 
       typeHint: "array" 
       } 
      } 
      use: {▼ 
       $default: CurlMultiHandler {#634 ▼ 
       -factory: CurlFactory {#667 ▼ 
        -handles: [] 
        -maxHandles: 50 
       } 
       -selectTimeout: 1 
       -active: null 
       -handles: [] 
       -delays: [] 
       } 
       $sync: CurlHandler {#666 ▼ 
       -factory: CurlFactory {#665 ▼ 
        -handles: [] 
        -maxHandles: 3 
       } 
       } 
      } 
      file: "/LARAVELPATH/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php" 
      line: "25 to 29" 
      } 
      $streaming: StreamHandler {#670 ▼ 
      -lastHeaders: [] 
      } 
     } 
     file: "LARAVELPATH/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php" 
     line: "49 to 53" 
     } 
     -stack: array:4 [▼ 
     0 => array:2 [▼ 
      0 => Closure {#672 ▼ 
      class: "GuzzleHttp\Middleware" 
      parameters: {▶} 
      file: "LARAVELPATH/vendor/guzzlehttp/guzzle/src/Middleware.php" 
      line: "54 to 69" 
      } 
      1 => "http_errors" 
     ] 
     1 => array:2 [▼ 
      0 => Closure {#673 ▼ 
      class: "GuzzleHttp\Middleware" 
      parameters: {▶} 
      file: "LARAVELPATH/vendor/guzzlehttp/guzzle/src/Middleware.php" 
      line: "148 to 150" 
      } 
      1 => "allow_redirects" 
     ] 
     2 => array:2 [▼ 
      0 => Closure {#674 ▼ 
      class: "GuzzleHttp\Middleware" 
      parameters: {▶} 
      file: "LARAVELPATH/vendor/guzzlehttp/guzzle/src/Middleware.php" 
      line: "27 to 43" 
      } 
      1 => "cookies" 
     ] 
     3 => array:2 [▼ 
      0 => Closure {#675 ▼ 
      class: "GuzzleHttp\Middleware" 
      parameters: {▶} 
      file: "LARAVELPATH/vendor/guzzlehttp/guzzle/src/Middleware.php" 
      line: "216 to 218" 
      } 
      1 => "prepare_body" 
     ] 
     ] 
     -cached: null 
    } 
    "allow_redirects" => array:5 [▼ 
     "max" => 5 
     "protocols" => array:2 [▼ 
     0 => "http" 
     1 => "https" 
     ] 
     "strict" => false 
     "referer" => false 
     "track_redirects" => false 
    ] 
    "http_errors" => true 
    "decode_content" => true 
    "verify" => true 
    "cookies" => false 
    ] 
} 

Wie Sie hier sehen können, gibt es hier nur einen Parameter namens 'auth' und nicht die Basisberechtigung, die hier in Guzzle dokumentiert ist: http://docs.guzzlephp.org/en/latest/request-options.html#auth

Obwohl ich erwähnen würde, dass die korrekten Werte eingegeben werden.

Für das Debugging habe ich nur dd($client) getan, ich weiß nicht, ob dies mir alle Antworten geben wird?Die andere Möglichkeit ist es Base64 zu kodieren (wie es in Basic Auth im Allgemeinen getan wird), und einen Header "Authorization" manuell hinzuzufügen, ich habe das versucht, aber ich bin mir nicht bewusst, ob ich es richtig mache, wenn ich es tue tun:

$credentials = base64_encode($clientvariable . ':' . $clientsecretvariable) 

Würde das der richtige Weg sein? Obwohl ich dies lieber als letzten Ausweg verwenden würde, wenn ich den Auth-Parameter nicht in Guzzle verwenden würde.

Ich kenne die anderen Stackoverflow-Fragen über Guzzle und grundlegende Auth, und ja, ich habe sie gelesen, hoffentlich habe ich mit genügend Informationen zur Verfügung gestellt, um das zu zeigen.

Antwort

0

Das Problem hier bezog sich darauf, wie ich die Antwort von Guzzle zurückgebe.

Da ich gerade $ Antwort zurückgegeben, die nur der Stream ist, hat der Browser nie etwas zurückgegeben, und seit Chrome automatische Aktualisierung, führt er die Anfrage zweimal, und zum zweiten Mal, ich würde nur meinen Code zweimal, das hätte einen Fehler zurückgegeben.

Ich war verrückt danach, bis ich Browser änderte und sah, dass nichts jemals passiert ist, was mich in die richtige Richtung wies.