Здесь происходит две вещи:
- Ответ 401 является обычным первым шагом к аутентификации Windows. Ожидается, что клиент затем повторно отправит запрос с учетными данными. AJAX-запросы не будут делать это автоматически, если вы не сообщите об этом.
Чтобы сообщить ему об отправке учетных данных в междоменном запросе (подробнее об этом позже), вам нужно установить withCredentials
опция, когда вы делаете запрос в JavaScript.
С jQuery это выглядит так:
$.ajax({
url: url,
xhrFields: {
withCredentials: true
}
}).then(callback);
Эти проблемы возникают, когда URL-адрес в адресной строке браузера отличается от URL-адреса API, к которому вы пытаетесь подключиться в JavaScript. Браузеры
очень разборчивы, когда это разрешено. Это так называемые «междоменные запросы» или «Междисциплинарный общий доступ к ресурсам» (CORS).
Он просматривает протокол, имя домена и порт. Таким образом, если веб-сайт http://localhost:8000
и отправляет запрос AJAX на http://localhost:8001
, это все еще считается междоменным запросом.
Когда междоменный запрос AJAX сделан, браузер сначала отправляетзапрос OPTIONS к URL-адресу, который содержит URL-адрес веб-сайта, который делает запрос (например, http://localhost:8000
). Ожидается, что API вернет ответ с заголовком Access-Control-Allow-Origin
, в котором указано, разрешено ли веб-сайту, выполняющему запрос.
Если вы не планируете отправлять учетные данные, тогда заголовок Access-Control-Allow-Origin
может быть *
, что означает, что API позволяет кому-либо вызывать его.
Однако, если вам нужно отправить учетные данные, как вы, вы не можете использовать *
. Заголовок Access-Control-Allow-Origin
должен содержать домен (и порт) вашей веб-страницы, а для Access-Control-Allow-Credentials
должно быть установлено значение true
. Например:
Access-Control-Allow-Origin: http://localhost:8000
Access-Control-Allow-Credentials: true
Это немного болезненно, да. Но это необходимо для безопасности.
Подробнее о CORS можно прочитать здесь: Обмен ресурсами между источниками (CORS)