Angular $ resource工厂不会添加Auth令牌头

时间:2016-07-20 10:56:12

标签: angularjs authentication dependency-injection resources factory

我有一个名为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请求的标头中。

2 个答案:

答案 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/

如果有人知道我之前做错了什么,我仍会感兴趣吗?