Ax ios запросы с использованием токена аутентификации иногда не выполняются в Safari - PullRequest
2 голосов
/ 01 февраля 2020

Я разрабатываю одностраничное приложение реагирования (16.9.0), в котором используется топор ios (0.19.0). Запросы ax ios используют аутентификацию токена для доступа к серверу, на котором запущены django -rest-framework (3.6.4) и django -cors-headers (3.1.1). Токены аутентификации генерируются django -rest-auth (0.9.5) во время входа в систему.

Приложение надежно работает в Chrome и Firefox. В Safari некоторые запросы не выполняются из-за ошибок 401.

Этот запрос выполняется во всех трех браузерах:

INFO basehttp: "GET /apis/games/?slug=pop HTTP/1.1" 200 60932```

код, который его генерирует, выглядит следующим образом:

    axios
      .get(`${simplUrl}/apis/games/?slug=${gameSlug}`, {
        headers: { Authorization: simplToken },
      })
      .then(res => {
        this.setState({
          game: res.data[0],
        });
      ...

Этот запрос не удался с Safari:

INFO basehttp: "OPTIONS /apis/runs/43 HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43 HTTP/1.1" 301 0
INFO basehttp: "OPTIONS /apis/runs/43/ HTTP/1.1" 200 0
WARNING basehttp: "DELETE /apis/runs/43/ HTTP/1.1" 401 58

, но он был успешно выполнен с Chrome:

INFO basehttp: "OPTIONS /apis/runs/43 HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43 HTTP/1.1" 301 0
INFO basehttp: "OPTIONS /apis/runs/43/ HTTP/1.1" 200 0
INFO basehttp: "DELETE /apis/runs/43/ HTTP/1.1" 204 0

код, который его генерирует, выглядит так:

      const url = `${simplUrl}/apis/runs/${run.id}`;
      // console.log('url:', url);
      axios
        .delete(url, {
          headers: { Authorization: simplToken },
        })
        .then(res => {
          // console.log(res);
          afterDelete();
        });

Ответ Safari 401 был:

"detail": "Authentication credentials were not provided."

Это информация, записанная Safari для неудачного запроса DELETE: enter image description here

Использование представлений DRF apis основано на это смешение:

class CommonViewSet(viewsets.ModelViewSet):
    authentication_classes = (TokenAuthentication, BasicAuthentication, SessionAuthentication)
    permission_classes = (IsAuthenticated,)

Для локальной разработки параметры CORS сервера DRF:

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_HEADERS = [
    'accept',
    'accept-encoding',
    'authorization',
    'content-type',
    'dnt',
    'origin',
    'user-agent',
    'x-csrftoken',
    'x-requested-with',
]

Я не понимаю, почему некоторые запросы в Safari не выполняются, а другие нет. В основном я хочу, чтобы все запросы работали во всех трех браузерах.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2020

Решение состояло в том, чтобы добавить конечный sla sh к URL, ссылающимся на один объект. Документы DRF Router указывают на правильный шаблон:

URL pattern: ^users/{pk}/$ Name: 'user-detail'

Является ли это ошибкой или функцией, которую Safari не включает токен аутентификации в перенаправленных запросах, приводящих к ошибке 401, я оставлю читателю.

0 голосов
/ 02 февраля 2020

Вы видели это ?, Я не совсем уверен, но это обсуждение может помочь.

Кроме того, поскольку ошибка связана с token, попробуйте убедиться, что ее отправлено или добавлено в запрос правильно или если оно имеет тип, например, перенос или что-то еще.

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

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

...