Принудително показване на диалоговия прозорец за HTTP удостоверяване на браузъра

Вече има няколко въпроса, които изискват потискане на диалоговия прозорец за HTTP удостоверяване на браузъра и те изглежда предполагат, че този диалогов прозорец се появява автоматично, когато кодът на отговора е 401 и заглавката WWW-Authenticate присъства в отговора.

Създавам уеб приложение, което извиква RESTful API, използвайки Ajax, което е защитено с основно HTTP удостоверяване. Работя както върху уеб приложението, така и върху API.

Поведението по подразбиране е, когато се изисква удостоверяване, но не присъства, просто да се даде грешка

{"error":"Authentication required"}

със статус 404. Бих искал обаче да създам една крайна точка, /user/login, която връща кода 401 и заглавката WWW-Authenticate, когато в заявката няма валидна заглавка Authorization. Знам, че това не е точно RESTful, но трябва да работи.

Сега внедрих това и когато отворя крайната точка в моя браузър, тя работи добре: показва се диалоговият прозорец на браузъра. Въпреки това, когато поискам крайната точка с помощта на Ajax, не се показва диалогов прозорец (и Chromium, и Firefox).

Как да принудя да показвам този диалогов прозорец с Ajax заявка, ако изобщо е възможно?

Точният отговор сега е:

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Access-Control-Allow-Origin: http://my-url
Cache-Control: no-cache
Date: Thu, 07 May 2015 12:21:10 GMT
WWW-Authenticate: Basic realm="Please login"

Please login

person Community    schedule 07.05.2015    source източник


Отговори (2)


Създайте уеб страница „Вход“, която изисква основно удостоверяване, и свържете към нея. Може да има мета или JavaScript пренасочване обратно към основното ви приложение; пренасочването ще бъде приложено само след като потребителят се е удостоверил.

Можете също така просто да поискате потребителско име и парола с помощта на JavaScript и да ги изпратите с последващи извиквания на Ajax (вижте https://stackoverflow.com/a/9613117/18706).

person mahemoff    schedule 07.05.2015
comment
Използвах втория подход, но не исках да съхранявам потребителското име и паролата локално от съображения за сигурност. И така, внедрих крайна точка на маркер в API, която изисква парола. Токенът е валиден известно време, може да се използва за влизане и може да се съхранява локално в бисквитка. Потребителят има възможност да свърже токени към своя IP. За важни действия, като промяна на имейл адрес и парола, все още изисквам удостоверяване с парола (подобно на режима sudo на GitHub), така че кражбата на бисквитки не е голям проблем. Както и да е, благодаря! - person ; 12.05.2015
comment
Да, обменът на токени има смисъл за подобрена сигурност. - person mahemoff; 13.05.2015

Като (временно?) заобиколно решение, сега пренасочвам потребителите към API, на който давам параметър redirect, към който потребителят се пренасочва обратно, когато удостоверяването е успешно.

person Community    schedule 07.05.2015