У нас довольно странная ситуация с внешним интерфейсом, основанным на реакции, использующим axios для общения с нашим внутренним интерфейсом, основанным на Django.
Когда вход в систему перед запросом OPTIONS отправляется axios (как и ожидалось), но в первый раз, когда сервер получает его, он выглядит некорректно и, следовательно, приводит к 401.
Однако, если я повторяю или даже повторяю тот же самый запрос, используя инструмент разработки для браузера, серверная часть принимает запрос OPTIONS, и все работает как положено. Мы можем последовательно воспроизвести это.
Журнал сервера разработки Django выглядит следующим образом:
Первый запрос
[23/Jan/2019 15:43:42] "{}OPTIONS /backend/api/auth/login/ HTTP/1.1" 401
Последующая попытка
[23/Jan/2019 15:43:52] "OPTIONS /backend/api/auth/login/ HTTP/1.1" 200 0
[23/Jan/2019 15:43:52] "POST /backend/api/auth/login/ HTTP/1.1" 200 76
Итак, как вы можете видеть, фигурные скобки добавляются в метод запроса, что означает, что запрос не считается запросом OPTIONS, и поэтому возвращается 401.
Вид Джанго
class LoginView(KnoxLoginView):
authentication_classes = [BasicAuthentication]
# urls.py (extract)
path('auth/login/', LoginView.as_view(), name='knox_login'),
Запрос Axios
axios.post('/backend/api/auth/login/', {}, {
headers: {
'Authorization': 'Basic ' + window.btoa(creds.username + ":" + creds.password)
}
}).then((response) => {
dispatch({type: 'SIGNIN_SUCCESS', response})
}).catch((err) => {
dispatch({type: 'SIGNIN_ERROR', err})
})
Некоторая информация о версии пакета
Django==2.1.4
django-cors-headers==2.4.0
django-debug-toolbar==1.11
django-extensions==2.1.4
django-rest-knox==3.6.0
django-rest-passwordreset==0.9.7
djangorestframework==3.9.0
axios@0.18.0