Laravel JWT токены становятся недействительными после обновления их в подходе JWT аутентификации
РЕДАКТИРОВАТЬ:
Прочитайте обсуждение об ошибке по адресу:https://github.com/tymondesigns/jwt-auth/issues/83
МОЙ ОРИГИНАЛЬНЫЙ ВОПРОС:
Я реализую сJWT-авт мои защищенные ресурсы, которые требуют аутентифицированного пользователя с приведенным ниже кодом:
Route::group(['middleware' => ['before' => 'jwt.auth', 'after' => 'jwt.refresh']], function() {
// Protected routes
});
Когда пользователь «входит» в API, создается токен авторизации, который отправляется в ответ на заголовок авторизации клиентскому приложению, которое вызывает ресурс. Таким образом, клиентские приложения при перехвате токена авторизации в заголовке любого ответа устанавливают переменную / сессию / что угодно с этим значением токена, чтобы снова отправлять в API при следующем запросе.
Первый запрос защищенного ресурса после 'login' работает нормально, но следующий запрос клиентского приложения к API с обновленным токеном выдает следующую ошибку (API монтирует все ответы в формате json):
{
"error": "token_invalid"
}
Что может случиться с обновленными токенами? Моя реализация токена обновления (установленная как промежуточное ПО) неверна? Или нет необходимости вручную обновлять все токены авторизации, которые идут с запросами клиентских приложений?
ОБНОВИТЬ:
Я обновляю промежуточное ПО jwt-auth RefreshToken в соответствии с предложениемВот, ноtoken_invalid
сохраняются.
BUG:
Я думаю, что я нашел, что происходит. Обратите внимание, что в методе обновления старый токен добавляется в включенный регистр кэша черного списка:
// 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']
])
);
}
И обратите внимание, что в методе add to blacklist ключом является параметр jti из старой полезной нагрузки токена:
// 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;
}
Таким образом, когда вызывается метод в черном списке, старый параметр токена jti совпадает с новым, поэтому новый токен находится в черном списке:
// Tymon\JWTAuth\Blacklist
public function has(Payload $payload)
{
return $this->storage->has($payload['jti']);
}
Если вам не нужна функциональность черного списка, просто установите значение false в файле конфигурации jwt.php. Но я не могу сказать, если это подвергается какой-либо уязвимости безопасности.
Прочитайте обсуждение об ошибке по адресу:https://github.com/tymondesigns/jwt-auth/issues/83