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