Токен Refresh становится недействительным при каждом перезапуске сервера django - DJANGO REST FRAMEWORK

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

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

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

Следовательно, я должен выводить пользователя из системы каждый раз после каждого перезапуска сервера.

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


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

REST_FRAMEWORK = {

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

}

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=1),
    'REFRESH_TOKEN_LIFETIME': timedelta(days=7),
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'UPDATE_LAST_LOGIN': True,
    'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
    'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
    'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}

Пожалуйста, предложите мне решение для устранения этой проблемы.

После того, как я снова и снова просматривал коды, я понял, что в простых настройках jwt ничего не было не так, но проблема была в другом месте. Проблема заключалась в SECRET_KEY

Я должен был получить значение секретного ключа из файла .env, для которого я написал код

SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", get_random_secret_key())

Приведенный выше код означает, что если вы найдете значение в DJANGO_SECRET_KEY, размещенное в .env файле, используйте его, иначе используйте get_random_secret_key() для генерации случайного секретного ключа. Ошибка, которую я допустил, была в файле .env, вместо того, чтобы объявить имя переменной как DJANGO_SECRET_KEY=ahhjkhjds, я объявил переменную как SECRET_KEY=ahhjkhjds. Таким образом, поскольку os.envrion.get не получал значения для DJANGO_SECRET_KEY, он генерировал новый секретный ключ при каждой перезагрузке сервера с помощью get_random_secret_key()

Это, в свою очередь, влияло на настройку в простых настройках jwt, т.е.

SIMPLE_JWT= {
   'SIGNING_KEY': SECRET_KEY,
}

По сути, каждый раз, когда сервер перезагружался, потому что SECRET_KEY имел новое значение, значение SIGNING_KEY менялось. Следовательно, старый токен обновления стал недействительным, даже если срок его действия не истек, так как его значение SIGNING_KEY не совпадало с текущим.

Следовательно, я получал ошибку Token is invalid or expired, когда пытался получить новый токен доступа после истечения срока действия уже сгенерированного токена обновления.

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