Токен обновления внезапно становится недействительным, даже если срок его действия не истек - Django Rest Framework +Reactjs

Я использую jwt-токены для аутентификации в приложении, использующем django rest для backend и react js для frontend. Обычный метод получения нового токена доступа после истечения срока его действия заключается в использовании токена обновления. Поэтому я использую перехватчики axios в react, чтобы перехватить, истек ли срок действия токена доступа, и если да, то я делаю запрос к refresh token api для генерации нового токена доступа. Код выглядит следующим образом

reactjs app

// intercepting the request
axiosInstance.interceptors.request.use(async (req) => {
  // condition to check if token available
  if (localStorage.getItem("pass")) {
    // this value is being set from local storage
    req.headers.Authorization = `Bearer ${localStorage.getItem("pass")}`;

    let user = jwt_decode(localStorage.getItem("pass"));

    const isExpired = dayjs.unix(user.exp).diff(dayjs()) < 1;

    if (!isExpired) {
      console.log("isExpired", isExpired);
      return req;
    }

    try {
      console.log("isExpired", isExpired);
      let response = await axios.post(`${baseURL}/account/revive/`, {
        refresh: localStorage.getItem("revive"),
      }); // this is refresh token api
      localStorage.setItem("pass", response.data.access);
      localStorage.setItem("revive", response.data.refresh); // refresh
      console.log(
        "finish setting access and refresh token in the local storage"
      );

      // this value is being set from the response recieved
      req.headers.Authorization = `Bearer ${response.data.access}`;
      console.log("added request headers with new access token");
      return req;
    } catch (error) {
      if (error.response) {
        console.log(error.response);
      } else if (error.request) {
        console.log(error.request);
      } else {
        console.log(error);
      }
    }
  }

  // * setting req.headers.Authorization to null if there is no token in local storage.
  req.headers.Authorization = null;
  return req;
});

Недавно я заметил, что когда перехватчик пытается сделать запрос к refresh token api, когда он обнаруживает, что срок действия маркера доступа истек, я получаю следующую ошибку, даже когда срок действия маркера обновления установлен на 7 дней

{
  "detail": "Token is invalid or expired",
  "code": "token_not_valid"
}

Я понятия не имею, почему это происходит внезапно. Пожалуйста, посоветуйте, что мне делать

Ниже приведены настройки jwt

django rest backend


INSTALLED_APPS = [
    "rest_framework",
    'rest_framework_simplejwt',
    'rest_framework_simplejwt.token_blacklist',
]

REST_FRAMEWORK = {

    'DEFAULT_AUTHENTICATION_CLASSES': (
 
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )

}

# SIMPLE JWT SETTINGS
SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'UPDATE_LAST_LOGIN': True,

    'ALGORITHM': 'HS256',
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': 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=7),
}

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