Мне нужно отправить запрос на авторизацию, используя базовую аутентификацию. Я успешно реализовал это с помощью jquery. Однако, когда я получаю ошибку 401, открывается базовое всплывающее окно браузера auth, и обратный вызов ошибки jquery ajax не вызывается.
javascript
jquery
rest
basic-authentication
Алексей Захаров
источник
источник
Ответы:
Я тоже недавно столкнулся с этой проблемой. Поскольку вы не можете изменить поведение браузера по умолчанию, отображающее всплывающее окно в случае
401
( базовой или дайджест- аутентификации), есть два способа исправить это:401
.200
Вместо этого верните код и обработайте его в своем клиенте jQuery.Измените метод, который вы используете для авторизации, на произвольное значение в заголовке. Браузеры будут отображать всплывающее окно для Basic и Digest . Вы должны изменить это как на клиенте, так и на сервере.
Также взгляните на это, чтобы увидеть пример использования jQuery с Basic Auth.
источник
<security:http-basic/>
вам не нужно определять,basicAuthenticationFilter
но следует определить его как<security:http-basic entry-point-ref="myBasicAuthenticationEntryPoint"/>
.401
иWWW-Authenticate:Bearer WWW-Authenticate:NTLM WWW-Authenticate:Negotiate
знаете ли вы, почему это должно бытьВерните общий код состояния 400, а затем обработайте его на стороне клиента.
Или вы можете оставить 401 и не возвращать заголовок WWW-Authenticate, который на самом деле является тем, на что браузер отвечает всплывающим окном аутентификации. Если заголовок WWW-Authenticate отсутствует, браузер не запрашивает учетные данные.
источник
res.removeHeader('www-authenticate'); // prevents browser from popping up a basic auth window.
Вы можете подавить базовое всплывающее окно аутентификации, указав URL-адрес запроса следующим образом:
Если вы получите ошибку 401 (неправильное имя пользователя или пароль), она будет правильно обработана с помощью обратного вызова ошибки jquery. Это может вызвать некоторые проблемы с безопасностью (в случае использования протокола http вместо https), но это работает.
UPD: поддержка этого решения будет удалена в Chrome 59
источник
https://user:pass@host/
в M59 примерно в июне 2017 года. Дополнительную информацию см. В этом сообщении блога chromestatus .Как указывали другие, единственный способ изменить поведение браузера - убедиться, что ответ либо не содержит код состояния 401, либо, если он есть, не включает
WWW-Authenticate: Basic
заголовок. Поскольку изменение кода состояния не очень семантично и нежелательно, хорошим подходом является удалениеWWW-Authenticate
заголовок. Если вы не можете или не хотите изменять приложение веб-сервера, вы всегда можете обслуживать или проксировать его через Apache (если вы еще не используете Apache).Вот конфигурация для Apache, чтобы переписать ответ для удаления заголовка WWW-Authenticate. IFF, содержащий запрос, содержит заголовок
X-Requested-With: XMLHttpRequest
(который установлен по умолчанию основными фреймворками Javascript, такими как JQuery / AngularJS и т. Д.) И ответ содержит заголовокWWW-Authenticate: Basic
.Проверено на Apache 2.4 (не уверен, что он работает с 2.2). Это зависит от устанавливаемого
mod_headers
модуля. (В Debian / Ubuntusudo a2enmod headers
и перезапустите Apache)источник
proxy_hide_header WWW-Authenticate;
Используйте X-Requested-With: XMLHttpRequest с заголовком запроса. Таким образом, заголовок ответа не будет содержать WWW-Authenticate: Basic.
источник
Если вы используете сервер IIS, вы можете настроить перезапись URL-адреса IIS (v2), чтобы переписать
WWW-Authentication
заголовокNone
на запрошенный URL-адрес.Гид здесь .
Значение, которое вы хотите изменить, -
response_www_authenticate
.Если вам нужна дополнительная информация, добавьте комментарий, и я отправлю файл web.config.
источник
Если заголовок WWW-Authenticate удален, вы не получите кеширование учетных данных и не получите обратно заголовок авторизации в запросе. Это означает, что теперь вам нужно будет вводить учетные данные для каждого нового запроса, который вы создаете.
источник
В качестве альтернативы, если вы можете настроить ответ сервера, вы можете вернуть 403 Forbidden.
Браузер не откроет всплывающее окно аутентификации, и будет вызван обратный вызов jquery.
источник
В Safari вы можете использовать синхронные запросы, чтобы браузер не отображал всплывающее окно. Конечно, синхронные запросы следует использовать только в этом случае для проверки учетных данных пользователя ... Вы можете использовать такой запрос перед отправкой фактического запроса, который может вызвать неудобства для пользователя, если контент (отправленный или полученный) довольно тяжелый.
источник
Создайте URL-адрес / login, а не принимайте параметры «пользователь» и «пароль» через GET и не требуйте базовой аутентификации. Здесь используйте php, node, java, что угодно и проанализируйте свой файл passwd и сопоставьте параметры (пользователь / пароль) с ним. Если есть совпадение, перенаправьте на http: // user: pass@domain.com/ (это установит учетные данные в вашем браузере), если нет, отправьте ответ 401 (без заголовка WWW-Authenticate).
источник
С обратной стороны с Spring Boot я использовал собственный BasicAuthenticationEntryPoint:
источник