强制显示浏览器的 HTTP 身份验证对话框

Force showing the browser's HTTP authentication dialog

已经有几个问题要求抑制浏览器的 HTTP 身份验证对话框,他们似乎建议在响应代码为 401WWW-Authenticate [=40 时自动出现此对话框=] 存在于响应中。

我正在构建一个使用 Ajax 调用 RESTful API 的 Web 应用程序,它受基本 HTTP 身份验证保护。我正在开发 Web 应用程序和 API。

默认行为是,当需要身份验证但不存在时,只给出一个错误

{"error":"Authentication required"}

具有 404 状态。但是,我想创建一个端点 /user/login,其中 returns 401 代码和 WWW-Authenticate header 当没有有效的 Authorization header 存在于请求中。我知道这不完全是 RESTful,但它应该有效。

我现在已经实现了这个,当我在浏览器中打开端点时它工作正常:浏览器的对话框显示。但是,当我使用 Ajax 请求端点时,没有显示任何对话框(Chromium 和 Firefox)。

如果可能的话,如何使用 Ajax 请求强制显示此对话框?

现在的确切回复是:

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.6 (Ubuntu)
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.9-1ubuntu4.9
Access-Control-Allow-Origin: http://my-url
Cache-Control: no-cache
Date: Thu, 07 May 2015 12:21:10 GMT
WWW-Authenticate: Basic realm="Please login"

Please login

作为(临时?)解决方法,我现在将用户重定向到 API,我给它一个 redirect 参数,当身份验证成功时,用户将被重定向回该参数。

创建一个需要基本身份验证的 "Login" 网页并 link 到它。它可以有一个元或 JavaScript 重定向回您的主应用程序;只有在用户通过身份验证后才会应用重定向。

您也可以使用 JavaScript 请求用户名和密码,并在随后的 Ajax 调用中发送它们(参见 )。