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

发布于 2024-11-30 10:59:06 字数 378 浏览 3 评论 0原文

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

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

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

有什么办法解决这个问题吗?之前的一个问题引用了 mozBackgroundRequest,但这似乎很难跨浏览器。

谢谢!

Attempting to keep as pure of a REST approach as possible, I decided that the application would be the API - down to the last bit.

Unfortunately, I have reached one stumbling block. After writing a Digest authentication handler in PHP, I found myself unable to make the experience as friendly for users in web browsers as an form-based authentication method would be.

The reason for this is that even though I can simulate a Digest authentication response through Javascript, using username and password from a HTML form (I can give the nonce values to the script safely, due to the way they are generated), on failure, the browser still shows the standard, ugly authentication prompt.

Is there any way around this? An earlier question references mozBackgroundRequest, but that seems hardly cross-browser.

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

还如梦归 2024-12-07 10:59:06

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

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

编辑

如果您控制 PHP 中的身份验证例程(如果身份验证失败,可能会执行 header(' HTTP/1.1 401 Unauthorized'); 等)你可以......不这样做。相反,使用正常的 200 OK 进行响应,但在正文中放入一个字符串,您可以在 ajax.responseText 中查找该字符串(例如“authFailed”或其他内容)。

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

目前,确切的机制在我的脑海中有点模糊(这是漫长的一天),但我确信可以使用该方法来完成。

You could make a request with AJAX first, to make sure the authentication details provided work.

If they do, do what you have been doing. If they don't, tell the user about it in your own, nicer way...

EDIT

If you control the auth routine in PHP (and if auth fails, presumably doing header('HTTP/1.1 401 Unauthorized'); etc) you can just... not do it. Instead, respond with a normal 200 OK but put a string in the body that you can look for in ajax.responseText (like 'authFailed' or something).

You can just add a header (or a cookie, or something) to the AJAX requests that are not present in normal browser requests, to allow you to distinguish between the AJAX auth checks and a normal, authenticated session.

The exact mechanics are a little fuzzy in my head at the moment (it's been a long day) but I am sure it could be done using that method.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文