Laravel JWT les jetons ne sont pas valides après les actualiser dans une authentification JWT approche
EDIT:
Lire la discussion sur le rapport de bogue à: https://github.com/tymondesigns/jwt-auth/issues/83
MA QUESTION INITIALE:
Je suis en œuvre avec jwt-auth mon protégé des ressources qui nécessitent un utilisateur authentifié avec soufflet code:
Route::group(['middleware' => ['before' => 'jwt.auth', 'after' => 'jwt.refresh']], function() {
//Protected routes
});
Lorsque l'utilisateur "s'inscrire" sur l'API d'un jeton d'Autorisation est créé et envoyé sur la réponse de l'en-tête d'Autorisation à l'application client qui appel à la ressource. Ainsi, les applications client lors de l'interception d'un jeton d'Autorisation sur l'en-tête de la réponse à définir une variable/session/que ce soit avec ce jeton de la valeur, pour l'envoyer de nouveau à l'API sur demande suivante.
La première demande pour une ressource protégée après 'login', qui fonctionne bien, mais la prochaine application client demande à l'API avec un jeton d'actualisation, donne le message d'erreur suivant (API monter toutes les réponses au format json):
{
"error": "token_invalid"
}
Ce qui peut se produire avec actualisé de jetons? Mon actualisation jeton de mise en œuvre (défini comme un après middleware) qui est mal? Ou n'est-ce pas nécessaire pour actualiser manuellement tous jeton d'Autorisation qui viennent avec des applications client demande?
Mise à JOUR:
- Je mettre à jour le jwt-auth RefreshToken middleware proposer ici, mais le token_invalid
persistent.
BUG:
Je suppose que j'ai trouvé ce qui se passe. Notez que dans la méthode refresh, ancien jeton est ajouté à la liste noire cache de cas activée:
//Tymon\JWTAuth\JWTManager
public function refresh(Token $token)
{
$payload = $this->decode($token);
if ($this->blacklistEnabled) {
//invalidate old token
$this->blacklist->add($payload);
}
//return the new token
return $this->encode(
$this->payloadFactory->setRefreshFlow()->make([
'sub' => $payload['sub'],
'iat' => $payload['iat']
])
);
}
Et note qu'en ajouter à la liste noire de la méthode de la clé est l'itc param de vieux jeton charge utile:
//Tymon\JWTAuth\Blacklist
public function add(Payload $payload)
{
$exp = Utils::timestamp($payload['exp']);
//there is no need to add the token to the blacklist
//if the token has already expired
if ($exp->isPast()) {
return false;
}
//add a minute to abate potential overlap
$minutes = $exp->diffInMinutes(Utils::now()->subMinute());
$this->storage->add($payload['jti'], [], $minutes);
return true;
}
Ainsi, lorsque sur la liste noire de la méthode est appelée, l'ancien jeton jti param est la même que la nouvelle, de sorte que le nouveau jeton est dans la liste noire:
//Tymon\JWTAuth\Blacklist
public function has(Payload $payload)
{
return $this->storage->has($payload['jti']);
}
Si vous n'avez pas besoin de la liste noire de la fonctionnalité de mise à false jwt.php fichier de configuration. Mais je ne peux pas dire si c'est l'exposer à une certaine vulnérabilité de la sécurité.
Lire la discussion sur le rapport de bogue à: https://github.com/tymondesigns/jwt-auth/issues/83
quand j'ai découvert ce problème, j'écris un wrapper pour jwt-auth pour le résoudre, parce que j'avais besoin d'une solution rapide. Fondamentalement, j'ai remplacer le RefreshToken middleware dans mon App\Http\Middleware paquet. Mais je vais tester la nouvelle version de vérifier ce qui se passe.
Je peux dire que le problème est encore sur. Merci beaucoup pour cette idée. La désactivation de la liste noire de travaillé
OriginalL'auteur Maykonn | 2015-04-17
Vous devez vous connecter pour publier un commentaire.
Quand je reçois ce problème, la solution que j'ai trouvé pour obtenir mon projet de travail a été de générer un nouveau jeton avec des données provenant d'anciens jeton sur chaque nouvelle demande.
Ma solution, qui fonctionne pour moi, est mauvais, le laid, et peut générer plus de problèmes si vous avez beaucoup de demandes asynchrones et votre API(ou de base) serveur est lent.
Pour l'instant est au travail, mais je vais enquêter sur ce problème, cause après la version 0.5.3 le problème persiste.
E. g:
Demande 1 (GET /connexion):
Demande 2 (POST /login réponse):
Du code de procédure de l'exemple(vous pouvez faire mieux =) ), vous pouvez l'exécuter sur routes.php de routes, je dis que c'est moche haha:
Certains parcours(exemple simple pour économiser de l'utilisateur de l'appareil mobile):
OriginalL'auteur Maykonn