У меня есть клиент js (vuejs) и серверная часть, использующая DRF в локальном режиме.
Я использую этот пакет для генерации токена: https://github.com/davesque/django-rest-framework-simplejwt
Я использую этот пакет https://www.npmjs.com/package/axios-auth-refresh для обработки логики обновления токена.
Основная цель - перехватить запрос, когда он возвращает ответ 401, выполнить запрос на обновление токена и затем разрешить первоначальный запрос с новым токеном.
Это работает, когда исходный запрос является запросом GET, но не когда это запрос POST.
При использовании запроса POST:
Запрос orgin выпадает в 401, когда срок действия токена истекает, тогда происходит перехватчик, но сервер не отвечает методом 405:
https://imgur.com/C1tchvb
метод из запроса от перехватчика не соответствует методу в коде, показанном выше (строки 3 и 4): как вы можете видеть, сервер получает полезную нагрузку из исходного запроса в качестве метода запроса:
https://imgur.com/nlAknMi
Я нашел этот пост: Сценарий приложения отправляет 405 ответ при попытке отправить запрос POST
я пытаюсь изменить заголовки, как советовали, но это не работает
Каким образом полезная нагрузка из первоначального запроса становится методом перехватчика, если исходным запросом является запрос Post с полезной нагрузкой?
Вот код из клиента javascript:
const refreshAuthLogic = failedRequest => axios(
{
method: 'post',
url: 'auth/refresh',
data: { refresh: store.state.token.refresh }
}).then(tokenRefreshResponse => {
store.dispatch('refreshToken', tokenRefreshResponse.data)
return Promise.resolve()
})
const instance = axios.create({
baseURL: '/api/'
})
instance.interceptors.request.use(config => {
config.headers.Authorization = `Bearer ${store.state.token.access}`
return config
})
createAuthRefreshInterceptor(instance, refreshAuthLogic)
EDIT
Мне удается заставить его работать, но я не совсем понимаю:
- проблема связана с DJANGO / DRF, а не с axios
- Похоже, что когда запрос POST выполнен и завершился неудачей (здесь с 401), сервер сохранил данные.
Вот часть, которую я не могу объяснить:
- когда запрос перехватчика (для обновления токена) попадает на сервер, он путается с данными предыдущего запроса.
Мне пришлось добавить промежуточное ПО в django, чтобы очистить тело, когда запрос не работает с 401, и он работал для меня. Но это не правильное решение, я думаю.