Ale*_*rov 98 javascript rest jquery basic-authentication
我需要使用基本身份验证发送授权请求.我已经使用jquery成功实现了这一点.但是当我得到401错误时,基本的auth浏览器弹出窗口被打开,并且没有调用jquery ajax错误回调.
nwi*_*ler 42
我最近也面临这个问题.由于您无法在401(基本或摘要式身份验证)的情况下更改浏览器显示弹出窗口的默认行为,因此有两种方法可以解决此问题:
401.返回200代码并在jQuery客户端中处理它.将您用于授权的方法更改为标题中的自定义值.浏览器将显示Basic和Digest的弹出窗口.您必须在客户端和服务器上更改此设置.
headers : {
"Authorization" : "BasicCustom"
}
Run Code Online (Sandbox Code Playgroud)也请看一看这对于使用jQuery使用基本身份验证的一个例子.
Ibr*_*eem 32
返回通用的400状态代码,然后处理该客户端.
或者您可以保留401,而不是返回WWW-Authenticate标头,这正是浏览器使用身份验证弹出窗口响应的内容.如果缺少WWW-Authenticate标头,则浏览器将不会提示输入凭据.
Iva*_*var 17
您可以使用请求网址抑制基本身份验证弹出窗口,如下所示:
https://username:password@example.com/admin/...
Run Code Online (Sandbox Code Playgroud)
如果您收到401错误(用户名或密码错误),将使用jquery错误回调正确处理.它可能会导致一些安全问题(在http协议而不是https的情况下),但它是有效的.
UPD:此解决方案支持将在Chrome 59中删除
小智 10
正如其他人所指出的,改变浏览器行为的唯一方法是确保响应不包含401状态代码,或者如果包含,则不包括WWW-Authenticate: Basic标题.由于更改状态代码不是非常语义和不可取的,因此一种好方法是删除WWW-Authenticate标题.如果您不能或不想修改您的Web服务器应用程序,您始终可以通过Apache提供或代理它(如果您尚未使用Apache).
这是一个Apache重写响应的配置,以删除请求包含的WWW-Authenticate头IFF包含头X-Requested-With: XMLHttpRequest(默认情况下由JQuery/AngularJS等主要Javascript框架设置...)并且响应包含标题WWW-Authenticate: Basic.
在Apache 2.4上测试(不确定它是否适用于2.2).这取决于mod_headers所安装的模块.(在Debian/Ubuntu上,sudo a2enmod headers重新启动Apache)
<Location />
# Make sure that if it is an XHR request,
# we don't send back basic authentication header.
# This is to prevent the browser from displaying a basic auth login dialog.
Header unset WWW-Authenticate "expr=req('X-Requested-With') == 'XMLHttpRequest' && resp('WWW-Authenticate') =~ /^Basic/"
</Location>
Run Code Online (Sandbox Code Playgroud)
将 X-Requested-With: XMLHttpRequest 与您的请求标头一起使用。所以响应头将不包含 WWW-Authenticate:Basic。
beforeSend: function (xhr) {
xhr.setRequestHeader('Authorization', ("Basic "
.concat(btoa(key))));
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
},
Run Code Online (Sandbox Code Playgroud)