是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?

Posted

技术标签:

【中文标题】是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?【英文标题】:Is there a cross-browser way to ignore 401 errors triggered by XHRs? 【发布时间】:2011-08-18 08:10:28 【问题描述】:

为了尽可能保持 REST 方法的纯粹性,我决定将应用程序作为 API - 直到最后一点。

不幸的是,我遇到了一个绊脚石。在用 php 编写了一个 Digest 身份验证处理程序后,我发现自己无法让 Web 浏览器中的用户体验像基于表单的身份验证方法那样友好。

这样做的原因是,即使我可以通过 javascript 模拟 Digest 身份验证响应,使用 html 表单中的用户名和密码(由于它们的生成方式,我可以安全地将 nonce 值提供给脚本),失败时,浏览器仍然显示标准的、丑陋的身份验证提示。

有没有办法解决这个问题?较早的问题引用了mozBackgroundRequest,但这似乎很难跨浏览器。

谢谢!

【问题讨论】:

【参考方案1】:

您可以先使用 AJAX 发出请求,以确保提供的身份验证详细信息有效。

如果他们这样做,就做你一直在做的事情。如果他们不这样做,请以您自己的更好的方式告诉用户...

编辑

如果您控制 PHP 中的 auth 例程(并且如果 auth 失败,大概是在执行 header('HTTP/1.1 401 Unauthorized'); 等),您可以……不这样做。相反,以正常的 200 OK 响应,但在正文中放入一个字符串,您可以在 ajax.responseText 中查找该字符串(例如“authFailed”或其他内容)。

您可以只向正常浏览器请求中不存在的 AJAX 请求添加标头(或 cookie 或其他内容),以便区分 AJAX 身份验证检查和正常的经过身份验证的会话。

目前我脑子里有些模糊(这是漫长的一天),但我确信可以使用这种方法来完成。

【讨论】:

嗯,这就是我目前正在做的事情。问题是提示对话框似乎无论如何都会显示 - 除非您的意思是我编写了某种其他验证数据的方法?这可能是一种选择,尽管很混乱。 不,我的意思是检查 responseCode 中的 401 - 我认为这会在不显示提示的情况下静默失败,但我只是尝试过,但没有。实际上,我只是从阅读另一篇文章中产生了一个想法,在一两分钟内看到我的编辑...... 刚刚测试过——我认为这似乎是最简洁的解决方案,直到希望浏览器供应商提供更好的方法。我遇到了一个不同的问题——我提出的身份验证请求不会被“记住”——但这是另一个问题,而且很可能仍未解决...... 你可以记住一些关于 Cookie 的东西,也许吧? 是的,但这几乎违背了使用 HTTP Digest 身份验证的目的,而不仅仅是滚动我自己的基于摘要的身份验证(可能由 Javascript 提供支持)

以上是关于是否有跨浏览器的方法来忽略 XHR 触发的 401 错误?的主要内容,如果未能解决你的问题,请参考以下文章

为什么form表单提交没有跨域问题,但ajax提交有跨域问题?

为什么form表单提交没有跨域问题,但ajax提交有跨域问题?

如何从 AJAX 调用触发浏览器的基本身份验证对话框?

是否有跨浏览器的方式在 expando 属性上使用 jQuery 选择器?

使用 XmlHttpRequest 时是不是有任何方法可以抑制浏览器在 401 响应中的登录提示

vue中axios请求拦截器和响应拦截器 以及401状态处理