在AngularJS和NodeJS中使用会话令牌(jwt)重定向到另一个应用程序

时间:2014-04-05 11:12:31

标签: node.js angularjs

我在angularjs中有一个启动模块。这个模块只是登录并有公共信息(登录,价格,通讯......)。我有很多角色,每个角色,我有一个应用程序(角度模块)。我之所以建立这种架构,是因为每个角色都有复杂的模块,所以不可能将所有角色放在一个模块中。

因此,对于登录,我在节点中使用jsonwebtoken,如下所示:

var token = jwt.sign(user, config.secureToken, { expiresInMinutes: 20*5});
res.json({ token: token, user: user });

完美无缺。我可以登录我的应用程序。之后,我必须提出一个重定向到正确模块的角色列表。 在角度,我有AuthHttp服务,添加安全标头(带令牌)与$ http呼叫休息服务。

如何重定向到' mydomain:port / anotherModule' $ location或$ http?

在nodejs中使用此代码:

app.get('/secondModule', expressJwt({secret: config.secureToken}), function (req, res) {
    res.render('restricted/secondModule/index.html');
});

NodeJs发送一个html代码作为回应并且确实没有重定向......

如果我在角度控制器中这样做:

location.href = route; 

我在nodejs控制台上有这个结果:

Error: No Authorization header was found

2 个答案:

答案 0 :(得分:2)

这是一篇很老的帖子,但我最近花了很长时间来弄清楚这一点。我可能错了,但我相信nodeJS / expressJS无法从会话存储中读取令牌。我相信您需要使用AngularJS通过请求标头传递令牌。

这取决于您使用的前端。对我来说,我正在使用AngularJS,我必须做这样的事情。

angular.module('AngularApp').factory('authFactory', 
  function($window){    //the window object will be able to access the token

      var auth = {};

      auth.saveToken = function(token){
        $window.localStorage['token_name'] = token;  //saving the token
      }

      auth.getToken = function(){
        return $window.localStorage['token_name'];  //retrieving the token
      }

      return auth;

}

.service('authInterceptor, function(authFactory){
  return { headers: {Authorization: 'Bearer "+ authFactory.getToken()}
}          //the last line gets the retrieved token and put it in req.header

然后,您只需要包含' authInterceptor'在与后端通信时的所有http方法中。这样,nodeJS就能够获取令牌。

如果您使用chrome开发人员工具并查看“网络”选项卡,则可以在req.header中看到“授权”字段。希望这会有所帮助。

答案 1 :(得分:1)

我不确定您使用的库,但问题似乎是您丢失了令牌,因为您导航到一个完全新的页面。 根据您的auth库,您需要将auth之后获得的令牌从一个页面传递到另一个页面。

这里的选项是使用浏览器sessionStorage或querystring将令牌传递回新页面(模块)上的http头集合