Я разрабатываю одностраничное приложение (16.9.0), которое использует axios (0.19.0). Запросы axios используют аутентификацию по токену для доступа к серверу, на котором запущены 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:
Использование представлений API DRF основано на этом смешении:
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 не выполняются, а другие нет. В основном я хочу убедиться, что все запросы работают во всех трех браузерах.