EDIT:laravel JWT gettoni non sono valide dopo di loro aggiornamento in un'autenticazione approccio JWT
Leggi la discussione sul bug in: https://github.com/tymondesigns/jwt-auth/issues/83
mia domanda iniziale:
Sono implementare con jwt-auth le mie risorse protette che richiedono un utente autenticato con codice qui sotto:
Route::group(['middleware' => ['before' => 'jwt.auth', 'after' => 'jwt.refresh']], function() {
// Protected routes
});
Quando l'utente "accede" all'API viene creato un token di autorizzazione e inviato sull'intestazione Autorizzazione di risposta all'applicazione client che chiama la risorsa. Quindi, le applicazioni client quando intercettano un token di autorizzazione sull'intestazione di qualsiasi risposta, impostano una variabile/sessione/qualsiasi cosa con questo valore di token, per inviare di nuovo all'API alla successiva richiesta.
La prima richiesta per una risorsa protetta dopo il 'login' funziona bene, ma la richiesta successiva applicazione client API con un token rinfrescato, dà il seguente errore (API montare tutte le risposte in formato JSON):
{
"error": "token_invalid"
}
Cosa può succedere con i token aggiornati? L'implementazione del token di aggiornamento (impostato come middleware successivo) è errata? O non è necessario aggiornare manualmente tutti i token di autorizzazione forniti con le richieste delle app client?
UPDATE:
aggiorno il RefreshToken middleware JWT-auth come proporre here, ma il token_invalid
persistono.
ERRORE:
Credo che ho trovato quello che succede. Si noti che nel metodo di aggiornamento, è aggiunto vecchio token per lista nera caso di cache abilitata:
// 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']
])
);
}
E notate che nel Inserisci nella lista nera metodo la chiave è il param ITC dal vecchio carico utile token:
// 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;
}
così, quando si è sulla lista nera metodo viene chiamato, il vecchio token ITC param è lo stesso che il nuovo, in modo che il nuovo token è in lista nera:
// Tymon\JWTAuth\Blacklist
public function has(Payload $payload)
{
return $this->storage->has($payload['jti']);
}
Se non è necessario la funzionalità lista nera appena impostato su false sul file di configurazione jwt.php. Ma non posso dire se esponga a qualche vulnerabilità di sicurezza.
Leggi la discussione sul bug in: https://github.com/tymondesigns/jwt-auth/issues/83
È il problema stato risolto nella nuova versione 0.5.3? Come menzionato dall'autore, è stato risolto nell'ultima versione. Ma ho ancora lo stesso problema come il tuo. – davidcoder
@davidcoder quando ho trovato questo problema, scrivo un wrapper su jwt-auth per risolverlo, perché avevo bisogno di una soluzione veloce. Fondamentalmente sovrascrivo il middleware RefreshToken nel mio pacchetto App \ Http \ Middleware. Ma testerò la nuova versione per verificare cosa succede. – Maykonn
Posso dire che il problema è ancora attivo. Grazie mille per questa intuizione. Disabilitare la lista nera ha funzionato –