Как запретить Safari перехватывать 401 ответ на запросы ajax - PullRequest
9 голосов
/ 04 февраля 2012

У меня возникла следующая проблема в расширении Safari. Я прошу пользователя предоставить свое имя пользователя / пароль для веб-службы и отправить быстрый запрос, чтобы проверить правильность учетных данных. Если это не так, служба ответит 401, как я полагаю. Проблема в том, что Safari, похоже, перехватывает этот ответ до того, как мой код javascript сможет его обработать, показывая серое поле для входа вместо разрешения ошибки.

Что я могу с этим поделать? Я использую библиотеку js для вызова, но она функционально эквивалентна следующему jQuery.

$.ajax({
  type: "GET",
  url: url,
  username: username,
  password: password,
  success: function() { /* handle success */ },
  error: function() { /* handle error */ }
});

Ответы [ 2 ]

4 голосов
/ 04 февраля 2012

Насколько я знаю (после того, как у меня возникла эта проблема), вы не сможете заставить Safari прекратить перехватывать 401.Если эти выводы верны, единственным способом является творческое (читай: неправильное) использование другого кода ошибки, например 403, или использование пользовательского (см. Ниже).

Конечно, это предполагает, чтоу вас есть доступ к изменению кода состояния, отправленного обратно из веб-службы (это не совсем понятно из вопроса, разрабатывали ли вы веб-службу тоже).

403, конечно, действительно говорит: «Выуже аутентифицирован, но не авторизован для доступа к этому ресурсу ", что неверно (отсюда и" неправильное использование "), но по крайней мере у него нет побочных эффектов в известных мне браузерах.

400иногда используется в качестве альтернативы, но так как этот («неправильный запрос») действительно предназначен для обозначения ошибки протокола HTTP, он может вызывать побочные эффекты (никогда не видел и не слышал о том, что это происходит, но потенциально он может вызвать чрезмерныйполезная попытка какого-либо будущего браузера или программного обеспечения для защиты от угона начать поиск и устранение неисправностей / диагностику).

412 - еще одна альтернатива, которую я видел («предварительное условие не выполнено»),но на самом деле это означает, что сервер не соответствовал предварительным условиям, установленным запросом .

Или вы можете создать свой собственный нестандартный4xx ошибка - например, 461 - что разрешено (обратите внимание, что в твиттере есть пользовательский 420 код состояния, например)

3 голосов
/ 08 января 2013

Более правильным подходом было бы продолжать использовать 401 в качестве кода ошибки, но не отправлять заголовок WWW-Authenticate, когда учетные данные были отправлены, но они не были правильными.

Это больше не вызываетдиалоговое окно браузера и позволяет обрабатывать 401 напрямую.

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