Как подавить диалог браузера "требуется аутентификация" при выполнении вызова ajax, который требует аутентификации?

мои пользователи вводят имя пользователя и пароль для сторонний сервис. Я делаю вызов ajax для этой службы, чтобы аутентифицировать их. Проблема в том, что если они вводят неправильное имя пользователя и пароль, браузер (по крайней мере firefox) отобразит диалоговое окно "требуется аутентификация". Если они затем введут правильное имя пользователя и пароль в этом диалоговом окне, мой вызов ajax вернет "успех", и появится, что исходный пользователь / пропуск, который они ввели, был правильным, когда это не так (так как они изменились он.)

есть ли способ либо подавить этот диалог (так что я могу затем мой сервис сказать им, чтобы исправить их пользователя/пропуск) или каким-то образом захватить правильное имя пользователя и пароль, которые пользователь ввел в диалоговом окне браузеров? Это расширение firefox.. поэтому я уверен, что есть какой-то способ получить правильный пропуск/логин из запроса.. но было бы неплохо, если бы был более простой метод через javascript.

jQuery.ajax({
  type: "GET",
  dataType: "xml",
  url: endpoint,
  username: username,
  password: password,
  success: function(data,status) {
    // Do something
  },
  error: function(XMLHttpRequest, textStatus, errorThrown){
    alert(errorThrown);
  }
});

5 ответов


Я решил эту проблему, поместив прокси между браузером и службой, которая требует аутентификации, в моем случае сервлет java. Браузер отправляет запрос AJAX сервлету, который пересылает запрос в службу, а затем отправляет ответ служб, опуская заголовок" WWW-Authenticate". Приложение браузера. обрабатывает код ответа HTTP 200 или 401 соответственно.

аналогично, прокси всегда может вернуть 200 с ответом json, указывающим результаты направленного запроса. Таким образом, вы можете увидеть разницу между сбоем вашего прокси-сервера и ответом службы.

одна сложная вещь, с которой вам, возможно, придется иметь дело - если служба дальнего конца отвечает заголовком set-cookie, скажем, потому, что она создала сеанс для вашего клиента, тогда у вас есть (по крайней мере) 2 возможных пути.

  1. ваш прокси будет помнить cookie, ваше приложение браузера. всегда проходит через прокси для этой службы, и прокси-сервер добавляет этот файл cookie для последующего перенаправленные запросы. или
  2. вы игнорируете файл cookie службы и повторно аутентифицируете браузер непосредственно с помощью службы после проверки имени пользователя и пароля через прокси-сервер. Хотя это может иметь побочный эффект создания потерянного сеанса со службой

вместо строки url-адреса"http://blah.com", сделайте это"http://user:password@blah.com"

// Note that you might need to trim http:// out of endpoint first
url: 'http://' + username + ':' + password + '@' + endpoint,

без jquery (не работает в IE, но это нормально для расширений firefox):

var xhr = new XMLHttpRequest();
xhr.open("GET", "http://example.com", true, "username", "password");
xhr.onreadystatechange = function(){
  if(this.readyState == 4){
    if(this.status == 200){
      alert("we got a response");
    }
  }
}
xhr.send();

Как насчет не использовать аутентификацию HTTP? Используйте стандартный логин с куки-файлами или просто опубликуйте имя пользователя/пароль, который пользователь предоставляет скрипту, и проверьте данные в базе данных пользователей.


вы не можете сделать это в IE или firefox, и вы никогда не сможете из javascript по соображениям безопасности. Нет настройки браузера, которая позволяет пользователю избежать запроса на проверку подлинности http. Это становится очень раздражающим, когда у вас есть 50 изображений, требующих аутентификации http.