2017-08-04 4 views
1

Die Hintergrundgeschichte dazu, ich habe aus der Dokumentation zu den Anweisungen gearbeitet: https://laravel.com/docs/5.4/passportLaravel 5.4 401/Unauthenticated mit Reisepass und mehrere Token-Typ

Ich habe

  1. Laravel 5.4
  2. „Laravel/Pass ": "^ 3.0" von Komponist
  3. Local Mac OS X läuft Mamp pro, Php 7.0.15

Ich rufe die Beispielbenutzer Route in Routen/api.php

Route::get('/user', function() { 
    return 'testing'; 
})->middleware('auth:api'); 

Postman curl Header (aus dem Code-Export in Postman gezogen):

CURLOPT_HTTPHEADER => array(
    "accept: application/json", 
    "authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6ImM3ZmI2ZmNmMWFkOGQ0NjFkNTdhMWU2NjFiYjhhOThmOTJhOTBkMDFkNDkwZDFjNDRkNDg5MTdlYjJiZWYyMDlkNjNmOTQwMjIxNTljZWI5In0.eyJhdWQiOiIxIiwianRpIjoiYzdmYjZmY2YxYWQ4ZDQ2MWQ1N2ExZTY2MWJiOGE5OGY5MmE5MGQwMWQ0OTBkMWM0NGQ0ODkxN2ViMmJlZjIwOWQ2M2Y5NDAyMjE1OWNlYjkiLCJpYXQiOjE1MDE3OTQ2NjIsIm5iZiI6MTUwMTc5NDY2MiwiZXhwIjoxNTMzMzMwNjYyLCJzdWIiOiIxIiwic2NvcGVzIjpbImFwaS1hY2Nlc3MiXX0.CPGM4PIKJBeiJvokuDzShz_1CnqHlnFIML-tWoBCn5GcijMXmQkWOHzTI8QwTws2h719TGA4hemXDljjqoZB0LiztAx2JZ3OhjNS-MhrMNujnTJUbvkXAVfcRdybhlDEWof_iboLICQTYNTslX1iw-2DCyFMh8gB4INAKUhpvzA955ALB-ZunKrjSNKdRkgtZRe0t6VyJf9LwzgjIAfSKoi_qRis36KD7hcf0Id_iWZkhvS-ZfuM5eUpzUooUe0rb4rkYYEYndlHlY7-uuZPlzmPMpaJTR4AW1CLkaK5Ic7fde1x1kk2duW_Znd9ki2YBP0kw7ifAmg2DaM5r2-0kEx_1iFuCIxE8QJns1aIm3XjWoOApovt7V6-s3yJZK3xlIDCjFI-C59RHiVSabh-hKdX4elvSL9taSQyuramPZPpsne9SUh4KCWul0iHoNjFdFJEut_TUBWyUPtD3J7gg6P97uRS_THDAUHMo2UYVhlnu9PV8SvbvjGj3OeaaH7ZbzWQCYKbqsLZAZ2mnJlFhTMghbaC2s_MND1zlRm7w9btmihxVW714NUbH8UAwSvrtIYYQ0itevZ59TLiAXprjmjkhiFkrhdX4bUje4uNEbLYawkZI-1o82IExW9D8kCYpOWOZdWTCLgmaE2wXcf-DTCV-9vDWRAdX1YmP4JbRsc", 
    "cache-control: no-cache", 
    "content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW", 
    "postman-token: 2ec7a2c8-3489-812d-4638-ebb7dc62aeb1" 
), 

Ich habe 1 persönlichen Zugriffstoken generiert mit die Vue-Komponenten

Ich habe überprüft, dass ich den Token Ablauf für 1 Jahr setzen und das spiegelt sich in der db.

Mein AuthServiceProvider.php

Passport::routes(); 

     // TODO MAKE THEM LAST A LONG TIME 
     Passport::tokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10) 
     Passport::refreshTokensExpireIn(Carbon::now()->addYears(20));//You can also use addDays(10) 
     Passport::pruneRevokedTokens(); //basic garbage collector 

     Passport::tokensCan([ 
      'api-access' => 'Access Complete API', 
     ]); 

Mein RouteServiceProvider.php (mapApiRoutes in der Karte Funktion aufgerufen wird)

protected function mapApiRoutes() 
    { 
     Route::group([ 
      'namespace' => $this->namespace, 
      'prefix' => 'api', 
     ], function ($router) { 
      require base_path('routes/api.php'); 
     }); 
    } 

Meine Kernel.php Route Middle

protected $routeMiddleware = [ 
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class, 
    'can' => \Illuminate\Auth\Middleware\Authorize::class, 
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 
]; 

- BEARBEITEN - NACH WEITERER FORSCHUNG

Ich benutze Postbote, um meine API-Auth zu testen und jedes Mal, wenn ich es versuche, eine 401 zu bekommen. Ich habe versucht, Personal Access Client und Password Grant Client und beide haben das gleiche Problem. Nachdem ich sie beide betrachtet hatte, erkannte ich, dass beide das Autorisierungsträger-Token-Format verwenden.

So begann ich Logging in verschiedenen Dateien in Passport-Quelle.

Im TokenGuard.php

public function user(Request $request) { 

    Log::info('TokenGuard: '. $request); 

    if ($request->bearerToken()) { 
     return $this->authenticateViaBearerToken($request); 
    } elseif ($request->cookie(Passport::cookie())) { 
     return $this->authenticateViaCookie($request); 
    } 
} 

Das Log sieht wie folgt aus:

[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1 
Accept:   application/json 
Accept-Encoding: gzip, deflate 
Cache-Control: no-cache 
Connection:  keep-alive 
Content-Type: application/json 
Host:   url.com:8888 
Postman-Token: 66707fe5-8f6e-4920-948b-2804a76d4a65 
User-Agent:  PostmanRuntime/6.2.5 


[2017-08-10 20:50:20] local.INFO: TokenGuard 93: GET /api/user HTTP/1.1 
Accept:   application/json 
Accept-Encoding: gzip, deflate 
Cache-Control: no-cache 
Connection:  keep-alive 
Content-Type: application/json 
Host:   url.com:8888 
Postman-Token: 66707fe5-8f6e-4920-948b-2804a76d4a65 
User-Agent:  PostmanRuntime/6.2.5 

Das, was fehlt, der Bearer [token] Teil des Antrags ist. Der TokenGuard-Code-Chunk führt ein if/else aus. Hier denke ich, dass der Fehler passiert.

Sollte das nicht auch protokolliert werden? Da das Bearer Token fehlt, schlägt das If/Else fehl, und dann ist es sinnvoll, eine 401.

Warum sollte mein Token aus der Anfrage entfernt werden.

+0

Wie bekommen Sie Ihr Token in JavaScript?Das Token im obigen Codebeispiel scheint zu lang zu sein. Sind Sie sicher, dass Sie das verschlüsselte Cookie nicht kopiert haben? – Kyslik

+0

Wenn Sie das persönliche Zugriffstoken erstellen, ruft die Vue-Komponente ein Modal auf, in dem sich das Token befindet. Ich habe es kopiert und dann benutzt. Ich habe es drei Mal versucht, um sicherzustellen, dass ich das nicht vermassele. –

+0

Ihre einzige Option ist es, diese selbst zu debuggen, relevante Dateien (sogar Laravel-Einsen) mit '\ Log :: info ...' Anweisungen zu modifizieren und selbst zu sehen, in welchem ​​Punkt Sie stecken bleiben. Habe Spaß! – Kyslik

Antwort

3

Fügen Sie diese auf Ihre .htaccess Datei des öffentlichen Verzeichnis Ihres Projekts:

RewriteEngine on 
RewriteCond %{HTTP:Authorization} ^(.*) 
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]