2016-03-07 76 views
0

我需要知道,如果我的身份验证和会话管理方法是正确的。会话和登录Node和AngularJS的用户数据

我使用会话管理,因为当我收到成功的身份验证。来自节点服务器。我在$ window.sessionStorage中存储了用户数据(没有任何传递的痕迹),并且如果用户标记为rememberMe(复选框),则也将数据存储在$ window.localStorage中。

通过这个我能够在不同的控制器中获取数据。尽管我在服务器(nodeJs)的某个地方阅读会话实现方面也是可能的。但我不确定如何与JSONToken身份验证一起使用会话。

我正在使用 https://jasonwatmore.com/post/2015/12/09/MEAN-Stack-User-Registration-and-Login-Example.aspx 作为一个学习的例子,但我无法理解它。

/app/app.js

为什么在run()方法?

// add JWT token as default auth header 
    $http.defaults.headers.common['Authorization'] = 'Bearer ' + $window.jwtToken; 

,什么是这样的:因此,使用会话服务器端与智威汤逊那种失败的使用目的

// manually bootstrap angular after the JWT token is retrieved from the server 
$(function() { 
    // get JWT token from server 
    $.get('/app/token', function (token) { 
     window.jwtToken = token; 

     angular.bootstrap(document, ['app']); 
    }); 
}); 

/controllers/app.controller.js

// use session auth to secure the angular app files 
router.use('/', function (req, res, next) { 
    if (req.path !== '/login' && !req.session.token) { 
     return res.redirect('/login?returnUrl=' + encodeURIComponent('/app' + req.path)); 
    } 

    next(); 
}); 

// make JWT token available to angular app 
router.get('/token', function (req, res) { 
    res.send(req.session.token); 
}); 

// serve angular app files from the '/app' route 
router.use('/', express.static('app')); 

回答

0

智威汤逊。 JWT在很多方面都很棒,但它们的优点之一就是无论哪个服务器拦截请求,他们都可以验证用户。

如果你把它放在一个会话中,你必须确保客户端保持去同一台服务器,因为会话保存在该机器的内存中。有很多方法可以解决这个问题,但它又有点挫败了JSON Web令牌的目的。

我做什么我有角/节点认证/ JWT刚刚通过了JWT早在头每一次,和我的中间件截获它:

req.header.whatever_my_tokens_name_is 
+0

如何在sessionStorage和localStorage中存储数据? –

+0

你可以向我解释我突出显示的代码部分 –

+0

那些在客户端上是好的。所以您只需从客户端抓取它们,并在每次使用时将它们传回服务器。然而,我会阻止在服务器端使用会话。了解使用localStorage可能会导致XSS攻击,因此请确保在应用程序中使用适当的头文件。虽然Angular有很多内置的防御措施!我为我的应用程序使用localStorage。你应该做的其他事情,没有localStorage和sessionStorage的区别,只是根据需要过期/更新JWT。 –

0

下面的代码设置$ HTTP将每个请求的JWT令牌发送到服务器。

// add JWT token as default auth header 
$http.defaults.headers.common['Authorization'] = 'Bearer ' + $window.jwtToken; 

下面的代码从'/ app/token'获取令牌并将其存储在LocalStorage中。之后,它开始角度。

// manually bootstrap angular after the JWT token is retrieved from the server 
$(function() { 
    // get JWT token from server 
    $.get('/app/token', function (token) { 
     window.jwtToken = token; 

     angular.bootstrap(document, ['app']); 
    }); 
}); 

这里这是检查中间件如果没有存储在req.session.token令牌和请求的URL不是“/登录”。如果是这样,请将重定向发送到“/ login”。

// use session auth to secure the angular app files 
router.use('/', function (req, res, next) { 
    if (req.path !== '/login' && !req.session.token) { 
     return res.redirect('/login?returnUrl=' + encodeURIComponent('/app' + req.path)); 
    } 

    next(); 
}); 

最后在这里,这是一个端点,客户端再次从服务器请求'/ token'。

// make JWT token available to angular app 
router.get('/token', function (req, res) { 
    res.send(req.session.token); 
}); 

无论如何,检查@摩根-克响应regarless会话侧和JWT。

我希望这会有所帮助。