我在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
答案 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头集合