我有一个AngularJS网络应用程序,我正在使用基本身份验证。这很好用,但是当用户输入错误的电子邮件或密码时,我想给他们一个很好的错误信息。因此,我返回401,其中的解释如下所述:http://leastprivilege.com/2013/04/22/web-api-security-basic-authentication-with-thinktecture-identitymodel-authenticationhandler/
这很好用,并且正确地返回带有推理词的401。然而,使用Angular的$ http解释状态代码为0而不是401的响应,此外,没有机会阅读原因,我想传递给我的用户。例如。未知的电子邮件或错误的密码。
我在Chrome和Firefox中对此进行了测试,并且在没有找到任何答案的情况下浏览了大量问题。我已经实现了这样的响应拦截器:
$httpProvider.responseInterceptors.push(function ($timeout, $q) {
return function (promise) {
return promise.then(function (successResponse) {
if (successResponse.config.method.toUpperCase() != 'GET')
showMessage('Success', 'successMessage', 5000);
return successResponse;
}, function (errorResponse) {
console.log("status: " + errorResponse.status, errorResponse.config);
switch (errorResponse.status) {
case 0:
case 401:
showMessage('Wrong email or password', 'errorMessage', 20000);
break;
case 403:
showMessage('You don\'t have the right to do this', 'errorMessage', 20000);
break;
case 500:
showMessage('Server internal error: ' + errorResponse.data, 'errorMessage', 20000);
break;
default:
showMessage('Error ' + errorResponse.status + ': ' + errorResponse.data, 'errorMessage', 20000);
}
return $q.reject(errorResponse);
});
};
});
当调试拦截器工作时,但状态代码永远不会是401,而是0。在Chrome控制台中,它会显示:
XMLHttpRequest cannot load http://localhost:64044/api/user/login/. Origin
http://localhost:63546 is not allowed by Access-Control-Allow-Origin.
我有机会让这个工作吗?
答案 0 :(得分:0)
这里的问题是您向托管JavaScripts的服务器发出请求。您将不得不使用jsonp来解决此错误消息。