2015-04-14 17 views
8

Ich verwende jwt-auth, um eine RESTful Auth-Ressource in meiner API zu machen. Wenn eine Client-App die Anmeldungsressource aufruft, wird der Benutzer case angemeldet, Ihr aktuelles Token muss ungültig gemacht werden, und so wird ein neues Token generiert.Logout-Problem mit Laravel JWT-Authentifizierung Authentifizierung

Aber Fall der aktuelle Token ist auf der schwarzen Liste ein TokenBlacklistedException wird geworfen.

Wie kann man überprüfen, ob ein Token auf der Blacklist steht? Oder wie man einen Benutzer "Abmelden" korrekt implementiert? Ich versuche, auf jwt-auth API-Quelle zu finden, aber nicht existiert eine getToken()->isBlacklisted() oder parseToken()->isBlacklisted() oder ein Validator, um es zu implementieren.

Jedes Token ist ungültig parseToken() löst eine TokenBlacklistedException aus, daher ist eine isBlacklisted-Methode eine gute Methode, um zu überprüfen, ob das Token gültig ist, bevor ein Token ungültig wird.

INFO:

Der Balg Code überprüfen, ob Nutzlast ungültig ist, die TokenBlacklistedException ausgelöst, wenn ungültig ist:

if(
    false === \Tymon\JWTAuth\Blacklist::has(
     \Tymon\JWTAuth\Facades\JWTAuth::getPayload($token) 
    ) 
) { 
    \Tymon\JWTAuth\Facades\JWTAuth::parseToken()->invalidate(); 
} 

Wie um zu überprüfen, wie:

if(false ===\Tymon\JWTAuth\Facades\JWTAuth::parseToken()->isBlacklisted()) { 
    // invalidate... 
} 

Antwort

9

Sie können einfach Wenn Sie die Sitzung auf der Clientseite löschen, wenn sie sich abmelden und das Token im Back-End ungültig machen, sollten Sie die Anwendung nicht verwenden schwarze Liste.

Technisch das Token auf der Client-Seite zu zerstören ist genug, aber für Session-Hijacking, ist es auch eine gute Idee, es auf dem Backend ungültig zu machen.

Wenn Sie ungültig sind, müssen Sie das Token zerstören, nachdem Sie Ihre Antwort von Laravel erhalten haben.

JWTAuth::invalidate(JWTAuth::getToken())): 

Dann auf Winkelseite

function logout() 
{ 
    UserService.logout().$promise.then(function() { 
     $cookieStore.remove('userToken'); 
     // redirect or whatever 
    }); 
} 

Eine Möglichkeit, Ausnahmen JWT umgehen kann Setup ist ein EventServiceProvider in Laravel, hier ist, was mir wie folgt aussieht:

use Illuminate\Contracts\Events\Dispatcher as DispatcherContract; 
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; 

class EventServiceProvider extends ServiceProvider { 

    /** 
    * The event handler mappings for the application. 
    * 
    * @var array 
    */ 
    protected $listen = [ 
     'tymon.jwt.valid' => [ 
      'App\Events\[email protected]', 
     ], 
     'tymon.jwt.user_not_found' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.invalid' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.expired' => [ 
      'App\Events\[email protected]' 
     ], 
     'tymon.jwt.absent' => [ 
      'App\Events\[email protected]' 
     ] 
    ]; 

    /** 
    * Register any other events for your application. 
    * 
    * @param \Illuminate\Contracts\Events\Dispatcher $events 
    * @return void 
    */ 
    public function boot(DispatcherContract $events) 
    { 
     parent::boot($events); 

     // 
    } 
} 

werden Sie registriere das in deiner app.php.

Dann implementiere ich die JWTEvents-Klasse mit Methoden für jedes Ereignis.

Wichtig zu beachten ist, dass wir die JWT-Ausnahmen abfangen und eine JSON-Antwort mit einem bestimmten Statuscode zurückgeben.

Auf der eckigen Seite, habe ich in meiner httpInterceptor-Klasse, fängt für diese http Statuscodes.

angular.module('ngApp') 
    .factory('httpInterceptor', function($q, $log, $cookieStore, $rootScope, Response) { 
     return { 

      request: function(config) { 
       // Where you add the token to each request 
      }, 

      responseError: function(response) { 

       // Check if response code is 401 (or whatever) 
       if (response.status === 401) { 
        // Do something to log user out & redirect. 
        $rootScope.$broadcast('invalid.token'); 
       } 
      } 
     } 
    }); 
+0

aber in meinem Fall, ich teste, wenn Angular.js App ein ungültiges Token senden, so wenn ist ungültig 'JWTAuth :: invalidate (JWTAuth :: getToken())):' wird die TokenBlacklistedException werfen oder sagen, dass ein ungültiges Token . Ich muss vor dem Ungültigmachen überprüfen, ob dies bereits zuvor geschehen ist. – Maykonn

+0

Oder löst eine TokenExpiredException aus, wenn ich versuche, ein abgelaufenes Token ungültig zu machen ... – Maykonn

+0

Ich habe meine Antwort aktualisiert, um Ihnen zu zeigen, wie ich damit umgehe –

1

Soweit ich verstehe, ist eine Sache, dass niemand gestresst ist die ‚jwt.refresh‘ (aka RefreshTokenMiddleware) verwendet, um das Token zu aktualisieren.

Nun, wenn jeder, der die Controller-Methode in einer Route wie

Route::group(['middleware' => ['jwt.auth', 'jwt.refresh']], function()... 

sicher eine Abmeldung ausführen möchte wickelt wird ein neues Token in Abmelde Antwort erhalten daher wird der Kunde in der Lage sein, neue Anforderungen zu erfüllen .

Ich hoffe, dies kann zur Klärung dieses Problems beitragen.

Verwandte Themen