Токен обновления аутентификации не работает, когда запрос orgin является методом POST - PullRequest
1 голос
/ 01 июля 2019

У меня есть клиент 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, и он работал для меня. Но это не правильное решение, я думаю.

1 Ответ

0 голосов
/ 01 июля 2019

К сожалению, библиотека слабо поддерживается и имеет некоторые недостатки.

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

Как есть, если вы посмотрите на lib source , вы найдете в самых первых строках:

/** @type {Object} */
const defaults = {

    /** @type {Number[]} */
    statusCodes: [
        401 // Unauthorized
    ]
};

Это означает, что только 401 кодУправляемый и statusCodes не экспортируются, поэтому они остаются частными.

Если вы хотите продолжать использовать эту библиотеку, вы можете ее разветвить, чтобы изменить то, что не подходит к вашему стеку, или просто скопировать источник, отредактируйте егои использовать его как локальный сервис.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...