如何禁用浏览器默认密码弹窗?

6
2个回答

4

问题在于,您没有对发送的用户名(即身份验证令牌)和(虚拟)密码进行Base64编码(这是HTTP基本身份验证方案的要求)。以下大致是您的代码应该如何编写:

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://onsip.highrisehq.com/account.xml');
xhr.setRequestHeader('Authorization', 'Basic ' + btoa(token + ':'));
xhr.onreadystatechange = function() { console.log(xhr.responseText); };
xhr.send();

我已经为您更换了子域名为'onsip',但您仍需要用您的身份验证令牌替换token

1
不太确定是否是这种情况 尝试 var xhr = new HMLHttpRequest(); xhr.open('GET', 'UrlToServerThatUsesBasicHttpAuthentication', true, Login, WrongPassword); xhr.send(); - simple
可能byoogle想告诉你的是,在37signals.com上使用基于POST的身份验证,而不是基于GET的基本身份验证。 - chx
正确,您应该使用“POST”。我通过对Highrise登录页面运行数据包嗅探器来获取上述参数,因此它们应该与页面发送的完全匹配(如果您查看页面源代码,您会看到表单方法设置为“POST”而不是“GET”)。我建议您尝试复制我传递的参数,因为它们对我有效。 - oldestlivingboy
请查看Highrise的API(http://developer.37signals.com/highrise/),因为我实际上并没有使用“用户名”和“密码”,而是使用“令牌”和“虚拟密码”,尽管我将尝试进行POST消息,并在之后给您反馈。 - simple
哦,我不知道他们有API。我以为你在屏幕抓取数据。你应该继续使用API(更加稳定)!现在我明白你的问题了——解决方案将在我的编辑答案中给出。 - oldestlivingboy

0

我知道在Firefox XUL代码中可以有两种方法来实现这个,但不适用于Web代码。其中一种方法我知道不适用于Google Chrome,而快速测试似乎表明另一种方法也不适用。

我想到了三个选项。

在可访问的服务器上设置一个密码检查页面(最好是同一台服务器),当通过安全连接查询时,它会回复一个指示用户/密码组合是否正确。如果你不是与运行此服务的服务器相关的人员,我会对你这样做感到不满,尽管成千上万的人都让Facebook等公司一直这样做!另一方面,说服人们不要像Facebook等公司一样这样做已经很难了,所以另一个人做同样的事情并不能帮助解决问题。
不要要求用户提供密码,内置提示将在每种情况下使用,并且是“正常”的用户/密码。个人而言,我更喜欢即使是基本的加密通道也比看起来像表单身份验证(不如Digest或其他模型在实际协议中隐藏某些密码)更加安全,因为虽然两者都可以对发送的密码进行一些奇怪和愚蠢的处理,但经验表明,表单更有可能由某些人创建,他们会说“当然我可以编写安全的代码,还需要考虑什么?”,而不是任何其他方案。
如果这是你自己的服务器,你可以用除401之外的其他内容响应错误的密码,并将其用作脚本中的信号以重新查询。最好为此设置一个特殊的“登录”URI,以便不会干扰更好行为的客户端。

回复#3,在大多数浏览器中,缺少WWW-Authenticate头将阻止身份验证弹出窗口,即使状态是401。当然,没有WWW-Authenticate头的状态401违反了规范...但是如果返回401以外的其他东西来表示身份验证失败也同样违反规范。这就是为什么这是一种应急手段。实际上,XmlHttpRequest对象应该有一个设置来禁用弹出窗口... - Mark Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接