【发布时间】:2014-07-30 14:02:59
【问题描述】:
我正在使用 RESTful API 构建 AngularJS (1.2.16) Web 应用程序,并且我想针对身份验证信息无效或不存在的请求发送 401 Unauthorized 响应。当我这样做时,即使存在 HTTP 拦截器,当通过 AngularJS 发出 AJAX 请求时,我也会看到浏览器显示的基本“需要身份验证”对话框。我的拦截器在该对话框之后运行,这为时已晚,无法做一些有用的事情。
一个具体的例子:
除非存在授权令牌,否则我的后端 API 会为 /api/things 返回 401。漂亮又简单。
在 AngularJS 应用程序方面,我查看了 docs 并在 config 块中设置了这样的拦截器:
$httpProvider.interceptors.push(['$q', function ($q) {
return {
'responseError': function (rejection) {
if (rejection.status === 401) {
console.log('Got a 401')
}
return $q.reject(rejection)
}
}
}])
当我加载我的应用程序,删除身份验证令牌,并对 /api/things 执行 AJAX 调用(希望触发上述拦截器)时,我看到了:
如果我取消该对话框,我会看到“Got a 401”的console.log 输出,这是我希望看到的而不是那个对话框:
很明显,拦截器在工作,但是拦截太晚了!
我在网上看到很多关于在这种情况下使用 AngularJS 进行身份验证的帖子,它们似乎都使用了 HTTP 拦截器,但没有一个提到弹出的基本身份验证对话框。我对其外观的一些错误想法包括:
- 响应中缺少
Content-Type: application/json标头?不,它就在那里。 - 需要返回承诺拒绝以外的其他内容?无论返回什么,该代码始终在对话框之后运行。
我是否遗漏了一些设置步骤或错误地使用了拦截器?
【问题讨论】:
-
为什么不使用 403 而不是 401?
-
我使用了 401,因为在最初的问题中,我删除了身份验证令牌(在我的情况下是 cookie)。 401 是在这里使用的正确响应代码,因为该请求需要身份验证并且没有提供。 403 用于提供身份验证但服务器拒绝访问资源时。
标签: javascript ajax angularjs http authentication