Django JWT: сохраняйте срок действия токена обновления фиксированным при обновлении

Я реализую аутентификацию на основе JWT для сайта Django, используя Django Rest Framework (DRF) и Simple JWT. В своей конфигурации я установил время жизни маркера доступа на пять минут и включил ротацию маркеров. Чтобы обновить токен до истечения срока действия, я реализовал функцию JavaScript, которая отправляет запрос на обновление токена доступа с помощью токена refresh. Однако я столкнулся с проблемой, когда ротация маркеров обновления приводит к изменению даты истечения срока их действия, что не позволяет пользователям автоматически выходить из системы по истечении срока действия их маркеров обновления.

Вот соответствующий JavaScript-код для обновления токенов:

 async function updateToken() {
    let authTokens = getTokensFromLocalStorage();
    let response = await fetch("http://127.0.0.1:8002/api/login/refresh/", {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify({ refresh: authTokens.refresh }),
    });
    let data = await response.json();
    if (response.status === 200) {
      setTokensToLocalStorage(data); // Save updated tokens to local storage
      setUser(jwtDecode(data.access)); // Update user
    } else {
      removeUser();
    }
  }

  let fourminutes = 1000 * 60 * 3; // Change to 3 minutes
  let interval = setInterval(() => {
    if (authTokens) {
      updateToken();
    } else {
      clearInterval(interval);
    }
  }, fourminutes);

А вот фрагмент моих настроек Simple JWT в Django:

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
    "REFRESH_TOKEN_LIFETIME": timedelta(weeks=52),
    "ROTATE_REFRESH_TOKENS": True,
    "BLACKLIST_AFTER_ROTATION": True,
    "UPDATE_LAST_LOGIN": True,
    "ALGORITHM": "HS256",
    "SIGNING_KEY": SECRET_KEY,
    "VERIFYING_KEY": "",
    "AUDIENCE": None,
    "ISSUER": None,
    "JSON_ENCODER": None,
    "JWK_URL": None,
    "LEEWAY": 0,
    "AUTH_HEADER_TYPES": ("Bearer",),
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    "USER_ID_FIELD": "id",
    "USER_ID_CLAIM": "user_id",
    "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
    "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    "TOKEN_TYPE_CLAIM": "token_type",
    "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
    "JTI_CLAIM": "jti",
    "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
    "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
    "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
    "TOKEN_OBTAIN_SERIALIZER": "api_key.views.MyTokenObtainPairSerializer",
    "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
    "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
    "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
    "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
    "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}

Существует ли способ предотвратить изменение срока действия токена обновления при ротации токена? Я хочу, чтобы пользователи выходили из системы по истечении срока действия их маркеров обновления, независимо от ротации маркеров. Любые соображения или предложения о том, как этого добиться, будут высоко оценены

Вернуться на верх