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.
Das gleiche Problem in Laravel 5.0. – Maykonn
Haben Sie dieses Problem gelöst? Ich bin sehr interessiert an dieser Lösung auch –
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