EDIT:tokeny laravel JWT są nieważne po odświeżyć je w podejściu uwierzytelniania JWT
zapoznać się z dyskusją na temat błędów w: https://github.com/tymondesigns/jwt-auth/issues/83
MY oryginalne pytanie:
jestem Implementacja z jwt-auth moich chronionych zasobów wymagających uwierzytelnionego użytkownika z kodem mieszanym:
Route::group(['middleware' => ['before' => 'jwt.auth', 'after' => 'jwt.refresh']], function() {
// Protected routes
});
Gdy użytkownik "loguje się" na interfejsie API, tworzony jest token autoryzacji i wysyłany w odpowiedzi na nagłówek autoryzacji do aplikacji klienckiej, która wywołuje zasób. Tak więc, aplikacje klienckie przechwytujące token autoryzacji w nagłówku dowolnej odpowiedzi, ustaw zmienną/sesję/cokolwiek z tą wartością tokena, aby ponownie wysłać do API przy następnym żądaniu.
Pierwszy wniosek do chronionego zasobu po „login” działa dobrze, ale następnego żądania aplikacji klienta API z odświeżonym tokena, daje następujący błąd (API zamontować wszystkie odpowiedzi w formacie JSON):
{
"error": "token_invalid"
}
Co może się stać z odświeżonymi tokenami? Moja implementacja tokena odświeżania (ustawione jako pośrednie oprogramowanie pośrednie) jest niepoprawna? Czy też nie jest konieczne ręczne odświeżanie wszystkich tokenów autoryzacji, które pochodzą z żądaniami aplikacji klienckich?
UPDATE:
zaktualizować JWT-auth RefreshToken middleware jak zaproponować here, ale token_invalid
utrzymywać.
BUG:
myślę, że znalazłem to, co się dzieje. Zauważ, że w sposobie odświeżania starych żeton zostanie dodany do listy zablokowanych przypadek cache włączona:
// 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']
])
);
}
i zauważ, że w dodatku do czarnej metodę kluczem jest param WIT ze starych tokena ładowności:
// 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;
}
tak więc, gdy jest na metodzie czarnej listy nazywa, stary żeton WIT param jest tym samym, że nowy, więc nowy żeton jest w czarnej liście:
// Tymon\JWTAuth\Blacklist
public function has(Payload $payload)
{
return $this->storage->has($payload['jti']);
}
Jeśli nie potrzebują funkcji czarnej listy po prostu ustaw na false na pliku konfiguracyjnym jwt.php. Ale nie mogę powiedzieć, czy naraża się na pewną lukę w zabezpieczeniach.
zapoznać się z dyskusją na temat błędów w: https://github.com/tymondesigns/jwt-auth/issues/83
Czy Twój problem został rozwiązany w nowej wersji 0.5.3? Jak wspomniano przez autora, został on rozwiązany w najnowszej wersji. Ale wciąż mam ten sam problem jak twój. – davidcoder
@davidcoder po znalezieniu tego problemu, piszę wrapper do jwt-auth, aby go rozwiązać, ponieważ potrzebowałem szybkiego rozwiązania. Zasadniczo zastępuję oprogramowanie pośrednie RefreshToken w pakiecie App \ Http \ Middleware. Ale przetestuję nową wersję, aby zweryfikować, co się dzieje. – Maykonn
Mogę powiedzieć, że problem nadal trwa. Dziękuję bardzo za ten wgląd. Wyłączenie czarnej listy zadziałało –