【问题标题】:Gracefully Handling 401 Not Authorized with Angularjs $http优雅地处理 401 未使用 Angularjs $http 授权
【发布时间】:2015-11-19 17:49:19
【问题描述】:

我目前正在处理 AngularJS 应用程序的登录页面问题。登录页面使用$http 服务通过基本身份验证 (Authorization: Basic (username and password in base 64)) 将用户名和密码提交到 Web 服务,该 Web 服务可能在也可能不在托管 Web 应用程序的同一服务器上运行。如果认证成功,服务器返回状态为 200 OK 的响应;否则,它会返回 401 Not Authorized。我们有一个错误函数来优雅地处理这种错误情况,但在它被调用之前,浏览器默认会显示一个模式对话框,让用户输入他或她的用户名和密码。我怎样才能防止这种情况发生?

我查看了几个来源,包括 XHR.send() 的 W3 标准,以寻求帮助,我的发现表明,在 Firefox 和 Chrome 中,浏览器对话框在对 XHR 调用的 401 响应后弹出以下是正确的:

1) 请求是“同源”(在 Web 服务运行在为 Web 应用提供服务的同一台服务器上的情况下)

2) 响应包含标头 WWW-Authenticate: Basic [some realm]WWW-Authenticate: Digest [some realm](我们的 Web 服务返回前者)

3) 请求不是通过在调用send() 方法的XHR 对象中专门设置用户名和密码来发出的。

我找到了一个测试站点(SO 不允许我链接到该站点),该站点展示了 401 响应所需的行为(没有模式登录框)。它满足前两个条件但避免满足第三个条件,显然是因为它通过将 XHR 对象的用户名和密码作为参数 #4 和 5 发送到其open() 函数来设置它们。我不确定是否有任何其他方法可以设置 XHR 对象的这些属性,因为我什至无法通过在浏览器的 JavaScript 调试器中检查 XHR 对象来找到它们。

问题是我们网站的登录服务本身并没有调用XmlHttpRequest.open()来传递用户名和密码;相反,它自己创建 Authorization 标头,并将其在 params 对象的 headers 集合中传递给$http。通过检查 angular.js 的源代码,我发现 $http 然后继续调用open(),只使用了三个参数。

Angular 是否提供了一种方法让$http 调用 open() 的 5 参数重载,或者以其他方式阻止此登录对话框出现?如果没有,我只能想到几个解决方法:

1) 以某种方式装饰 $http 以强制调用 open() 的 5 参数重载(如果提供了用户名和密码)

2) 不知何故使用$httpBackend 来实现与#1 相同的效果(尽管文档不鼓励开发人员使用$httpBackend,所以我不确定这是否是一个好主意甚至可能)

3) 忽略$http,让我的登录服务自行创建并发送 XHR

4) 更改服务器,使其不返回 WWW-Authenticate: Basic 标头(最不希望的)

是否有一种众所周知的或“正确”的方法来解决这个问题?

【问题讨论】:

标签: javascript angularjs authentication angularjs-http


【解决方案1】:

您面临的问题是由于您指定的第一个原因

1) 请求是“同源”(在 Web 服务运行在为 Web 应用提供服务的同一台服务器上的情况下)。

解决方案

将 access-control-allow-origin 标头添加到您的后端服务以接受来自不同来源的呼叫。

如果您处于开发阶段,并且稍后您的前端和服务将处于同一来源,请使用https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en 扩展,

这将允许您覆盖 chrome 跨源策略(这仅用于开发,它是一种解决方法)。

通过从命令提示符打开 chrome 打开禁用网络安全的 chrome

chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2012-11-01
    • 2013-09-11
    • 2023-02-03
    • 2019-11-12
    • 1970-01-01
    • 2011-01-09
    • 2021-05-04
    • 1970-01-01
    相关资源
    最近更新 更多