Токен 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
, когда пытался получить новый токен доступа после истечения срока действия уже сгенерированного токена обновления.