身份验证:会话,JWT还是其他什么?

时间:2016-07-19 09:39:34

标签: node.js session authentication jwt

我有一个为用户提供网站服务的网络服务器。通过这个网站,他们可以使用oauth登录,我目前将其存储在服务器上的会话中。会话基本上只是告诉我这是什么用户以及他们是否登录(这是我想要的)。

然后我有一个API服务器,它只用于查询可能受到保护的信息(即,只有用户签名才能看到它)。 API服务器只能通过主服务器访问,主服务器只代理所有内容。 API服务器可以访问同一个后备存储,这意味着它可以读取会话并处理需要进行身份验证检查的请求。这种方法的一个优点是:由于会话只存储在内存中直到保存,我需要在每次将请求代理到服务器时保存它以确保API服务器具有新数据。

但这不是真正的问题,真正的问题是当用户访问时说/account,我想预先获取他们需要的所有数据并在发送它们之前在服务器上构建整个站点(所以他们不要#39; t必须等待http请求并再次呈现整个站点)。这是有问题的,因为当服务器尝试访问仅经过身份验证的用户可以看到的区域时,它会被拒绝。要解决这个问题,我需要在请求中注入会话ID并重新编写许多直观感觉错误方法的代码。如果我使用JWT,我或许可以创建一个超级用户令牌"服务器将生成哪个允许它访问经过身份验证的区域的任何部分,但这也有风险。

你们有什么想法?

可能相关的一些其他信息:

  • 我正在使用反应并进行服务器端渲染
  • 我正在使用redux(这是我试图预填的状态)
  • 我正在使用Node

提前致谢!

1 个答案:

答案 0 :(得分:0)

在每个安全路由/端点的控制器之前使用中间件 如果令牌有效,请检查您的jwt令牌,然后调用下一个中间件。

 router.route('/post')
.post(isAdmin,postCntr.addPost);



  function isAdmin (req, res, next) {
    var token = req.headers['authentication'] || req.body.token || req.params.token;
    if (token) {
        // verifies secret and checks exp
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {
            if (err) {
                return res.json({
                    err: err,
                    success: false,
                    message: 'Failed to authenticate token.'
                });
            } else {

                next();
            }
        });

    } else {

        // if there is no token
        // return an error
        return res.status(403).send({
            success: false,
            message: 'No token provided.'
        });
    }
}