Как отключить диалоговое окно «Требуется проверка подлинности» браузера при выполнении вызова ajax, требующего проверки подлинности? - PullRequest
6 голосов
/ 26 октября 2009

Мои пользователи вводят имя пользователя и пароль для стороннего сервиса. Я делаю 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 ]

1 голос
/ 09 ноября 2009

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

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

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

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

Вместо строки URL-адреса "http://blah.com", make it" http://user:password@blah.com"

// Note that you might need to trim http:// out of endpoint first
url: 'http://' + username + ':' + password + '@' + endpoint,
0 голосов
/ 09 ноября 2009

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

0 голосов
/ 09 ноября 2009

Без 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();
0 голосов
/ 08 ноября 2009

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

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