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

Ответы на вопрос(1)

Ваш ответ на вопрос