Контекст:
У меня есть форма входа в SPA, которая делает AJAX-вызов Silex-PHP API. Если учетные данные верны, все работает гладко. Если учетные данные неверны, сервер возвращает 401 Unauthorized, и Firefox / Chrome показывает форму входа по умолчанию.
я прошел сквозь этот а также этот вопросы, чтобы попытаться избежать запроса браузера.
Одним из предлагаемых решений является установка заголовка WWW-Authenticate в ответе на что-то отличное от Basic. Что я сделал в своем Silex API с:
$response->headers->set('WWW-Authenticate', 'FormBased');
При отправке запроса через Почтальон он показывает, что работает:
Cache-Control → no-cache
Connection → Keep-Alive
Content-Type → application/json
Date → Fri, 30 Jan 2015 19:13:49 GMT
Keep-Alive → timeout=5, max=100
Server → Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8
PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
Transfer-Encoding → chunked
WWW-Authenticate → FormBased <------------------------
X-Powered-By → PHP/5.6.2
Однако при выполнении запроса через браузер AJAX ответ выглядит так:
Cache-Control no-cache
Connection Keep-Alive
Content-Type text/html; charset=UTF-8
Date Fri, 30 Jan 2015 19:03:11 GMT
Keep-Alive timeout=5, max=74
Server Apache/2.2.29 (Unix) mod_fastcgi/2.4.6 mod_wsgi/3.4 Python/2.7.8
PHP/5.6.2 mod_ssl/2.2.29 OpenSSL/0.9.8y DAV/2 mod_perl/2.0.8 Perl/v5.20.0
Transfer-Encoding chunked
WWW-Authenticate Basic realm="Secured" <------------------------
X-Powered-By PHP/5.6.2
WWW-Authenticate и Content-Type различаются в ответах на один и тот же запрос.
AJAX Call это:
$.ajax({
url:url,
type:'GET',
dataType:"json",
contentType: "application/json",
headers: { 'PHP_AUTH_USER' : formValues.username, 'PHP_AUTH_PW' : formValues.password },
success:function (data) {
console.log(["Login request details: ", data]);
if(data.error) { // If there is an error, show the error messages
console.log('error data');
}
else { // If not, send them back to the home page
App.trigger("home:show");
}
},
error:function(){
console.log('error logging in');
},
statusCode: {
401: function(){
console.log('401 invalid credentials');
}
}
});
Чем могут отличаться ответы? Как я могу удалить или переопределить заголовок WWW-Authenticate в ответе для браузеров?
Это связанный вопрос и как я наконец решил проблему:
Других решений пока нет …