【问题标题】:Authentication: sessions, JWT, or something else?身份验证:会话、JWT 还是其他?
【发布时间】:2016-11-22 03:04:27
【问题描述】:

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

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

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

你们觉得呢?

一些可能相关的附加信息:

  • 我正在使用 react 并进行服务器端渲染
  • 我正在使用 redux(这是我尝试预填充的状态)
  • 我正在使用节点

提前致谢!

【问题讨论】:

    标签: node.js session authentication jwt


    【解决方案1】:

    在每个安全路由/端点中的控制器之前使用中间件 在此中间件中检查您的 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.'
            });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-24
      • 2020-08-29
      • 1970-01-01
      • 2017-11-25
      • 2017-06-16
      • 2015-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多