2015-03-17 11 views
5

Ich implementiere JWT-Authentifizierung in einer eckigen/Laravel-Anwendung und ich habe ein Problem mit Token-Aktualisierung.laravel/angularjs JWT-Token aktualisieren

Hier der entsprechende Code:

PHP: die Laravel-jwt Listener, 'hören' für tymon.jwt.expired Veranstaltung:

/** 
    * Fired when the token has expired 
    * @param \Exception $e 
    * @return \Illuminate\Http\JsonResponse 
    */ 
    public function expired($e) 
    { 
     $token = \JWTAuth::parseToken(); 

     Config::package('tymon/jwt-auth', 'jwt'); 
     $ttl = Config::get('jwt::refresh_ttl'); 

     $iat = Carbon::createFromTimestamp($token->getPayload()->get('iat')); 
     $now = Carbon::now(); 

     // if renew ttl is expired too, return 401, otherwise let 
     // the application generate a new token to frontend 
     if ($iat->diffInMinutes($now) >= $ttl) { 
      unset($iat, $now, $ttl); 
      return response_failure(
       Lang::get('errors.api.auth.expired'), 
       Config::get('status.error.unauthorized') 
      ); 
     } 

     unset($iat, $now, $ttl); 
    } 

PHP: die 'nach' Filter:

/* 
|-------------------------------------------------------------------------- 
| JWT-Auth token-refresh Filter 
|-------------------------------------------------------------------------- 
| 
| The RefreshToken filter update the response headers by returning an 
| updated authentication token. 
| 
*/ 
Route::filter('RefreshToken', function($route, $request, $response) 
{ 
    $token = JWTAuth::parseToken(); 

    try { 
     $token->toUser(); 
    } catch (TokenExpiredException $e) { 
     Config::package('tymon/jwt-auth', 'jwt'); 
     $ttl = Config::get('jwt::refresh_ttl'); 

     $iat = \Carbon\Carbon::createFromTimestamp($token->getPayload()->get('iat')); 
     $now = \Carbon\Carbon::now(); 

     if ($iat->diffInMinutes($now) < $ttl) { 
      $response->headers->set('Authorization', 'Bearer ' . $token->refresh()); 
     } 
    } 
}); 

PHP: Die authentifizierte Routen Filter:

Route::group(['before' => 'jwt-auth', 'after' => 'RefreshToken'], function() { ... }); 

JS: Die Abfangjäger, die die localstorage aktualisiert

'use strict'; 

angular.module('App') 

    .factory('ResponseInterceptor', ['SessionService', 'jwtHelper', '$location', '$q', 
     function (SessionService, jwtHelper, $location, $q) { 

      return { 
       response: response 
      }; 

      // called for http codes up to 300 
      function response(response) { 
       var token = response.headers('Authorization'); 
       if ('undefined' !== typeof token && null !== token) { 
        SessionService.setToken(token.split(' ')[1]); 
       } 
       return response; 
      } 
     }]); 

Das funktioniert gut, außer für ein Problem (Workflow):

  • Token läuft ab, kann aber immer noch erneuert werden
  • eckig senden an HTTP-Anforderung mit der abgelaufenen Token-Server
  • Laravel die Anforderung abfangen und aktualisiert die Antwort-Header mit einer neuen Token
  • Laravel schwarzen Liste des vorherigen Token

Das Problem ist, dass, wenn eine Anforderung von Winkeln gesendet während Die "Erneuerung" Verzögerung, alle diese Anfragen werden vom Server abgelehnt, weil das Token ungültig ist (auf der schwarzen Liste).

Mache ich Dinge falsch? Kann mir jemand in die richtige Richtung zeigen?

Was ich erreichen möchte, ist das Setzen der TTL des Tokens um etwa 5 Minuten und erlauben Sie dem Benutzer, das Token während der Navigation zu erneuern.

+0

Das gleiche Problem in Laravel 5.0. – Maykonn

+0

Haben Sie dieses Problem gelöst? Ich bin sehr interessiert an dieser Lösung auch –

+0

hey, das scheint ein bekanntes Problem zu sein, überprüfen Sie hier, sollte ein Update verfügbar sein: https: // github.com/tymondesigns/jwt-auth/issues/63 # issementcomment-93138770 – kitensei

Antwort

1

war in der Tat ein Fehler der Bibliothek, jetzt korrigiert, read here für weitere Informationen

0

Vielleicht verwenden Sie Async-Anfragen? Dann bist du dir nicht sicher, ob du den frischesten Token sendest.

In diesem Fall sollten Sie die Aktualisierungsmethode nicht nach jeder Anforderung verwenden. Dieser

+0

Das Problem war das, was ich kommentierte, ich werde eine Antwort, so dass andere Leute es leicht finden können – kitensei

0

ich gleiches Problem hatte. Wenn ein Token aktualisiert wird, wird das letzte Token auf die schwarze Liste gesetzt. Sie benötigen dieses Token jedoch, wenn vor der letzten Antwort ein anderer Async-Aufruf gestartet wird. Daher kann eine Lösung das letzte Token mit Verzögerung auf die schwarze Liste setzen. Und Sie können dies tun, indem Sie JWT_BLACKLIST_GRACE_PERIOD in Ihrer jwt.php Konfigurationsdatei setzen. ♥♥♥

Verwandte Themen