我有一个名为currentUser的角度工厂,用于在用户登录我的应用程序时保存用户信息(包括身份验证令牌)。这个工厂注入了很多控制器,在这些情况下,使用currentUser.getProfile()。token时没有问题。
我还有各种其他工厂,每个工厂都返回一个$ resource对象来进行API调用。在这些工厂中,我注入currentUser,以便我可以获取auth令牌以添加到请求标头。以下是其中一个工厂的简化示例:
angular
.module("common.services")
.factory("userAccount",
["$resource",
"appSettings",
"currentUser",
userAccount])
function userAccount($resource, appSettings, currentUser) {
return {
logout: $resource(appSettings.serverPath + "/api/Account/Logout", null,
{
'logoutUser': {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + currentUser.getProfile().token
}
}
})
}
}
但是,currentUser.getProfile()。令牌总是为空的,我得到一个无法解决的错误,即使我在一个我的控制器中记录它不是空的。可能导致这种情况的原因是什么?
编辑:问题似乎不仅仅是当前的用户工厂,就像我用localStorage.getItem替换currentUser.getProfile()。token(' Token')I似乎有同样的问题。控制器将正确记录本地存储的令牌,但不会将其添加到API请求的标头中。
答案 0 :(得分:3)
您需要logout
成为返回$resource
的函数。
现在的方式就是在服务初始化之后立即调用currentUser.getProfile()
,这可能是在用户登录之前发生的
function userAccount($resource, appSettings, currentUser) {
return {
logout: function() {
return $resource(appSettings.serverPath + "/api/Account/Logout", null, {
'logoutUser': {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + currentUser.getProfile().token
}
}
})
}
}
}
现在,在您致电userAccount.logout()
答案 1 :(得分:0)
不完全是修复,但似乎有一些解决方法。 我选择使用的是将auth令牌添加为常见的http标头,如下所示:
$http.defaults.headers.common['Authorization'] = 'Bearer ' + data.access_token;
关于它的博客文章: http://blog.brunoscopelliti.com/authentication-to-a-restful-web-service-in-an-angularjs-web-app/
如果有人知道我之前做错了什么,我仍会感兴趣吗?