【问题标题】:ExpressJS + JWT. What's the proper way to get auth data?ExpressJS + JWT。获取身份验证数据的正确方法是什么?
【发布时间】:2018-03-10 14:12:26
【问题描述】:

让我们跳到一个例子。我将跳过一些部分,例如导入、导出。

我有一个名为 controllers/book.js 的控制器,它有一个路由:

router.get('/my-books', function(req, res) {
    if(Auth.authenticated(req,res)) {
        Book.getMyBooks(function(rows) {
            response.operationSucceed(req, res, rows);
        });
    }
});

然后,在一个名为 models/book.js 的模型中,我拥有该功能:

function getMyBooks(successCallback) {
    db.query('SELECT * FROM book b WHERE b.id_user=?', [Auth.getLoggedUID()], function(rows) {
        successCallback(rows);
    });
}

我的问题是关于 Auth.getLoggedUID 函数。 假设我有一个 JWT 身份验证并假设我在有效负载中有一个 UID(这甚至可以接受吗?),检索它的最佳选择是什么?除了每次将req 传递给我需要身份验证数据的每个函数之外,是否有任何其他功能?

我可能在一个函数中执行了一个函数,我是否需要将req 都通过它们来获取用户ID?像这样?:

function getBooks(req) {
    getMyBooks(req);
    getCriminalBooks(req);
    getEvenOtherBooksByAuthor(req, authorId);
}

老实说,我不喜欢那样。 也许我的整个概念都是错误的,我应该以不同的方式做事? 有人可以在这种情况下为我指出正确的方向吗?

【问题讨论】:

    标签: javascript node.js express model-view-controller jwt


    【解决方案1】:

    您可以在标头中传递 UID 并在控制器中检索它:

    var uid =req.header('UID');
    

    然后将这个 UID 传递到您想要的任何地方,无需在任何地方结转整个 req 对象。

    【讨论】:

      【解决方案2】:

      您可以使用中间件功能。假设每个到达端点的请求都会有一个令牌,您应该检查并可能对其进行解码。之后,您可以将解码后的内容设置为 req 对象。所以是这样的:

      app.use(function(req, res, next) {
          // get the token from the request headers most likely.
      
          // verify and decode the token
      
          // set the decoded content to the request
          var payload = ..
          req.payload = payload;
      });
      

      在此之后,您可以访问您拥有的每个端点中的有效负载。因此,例如在某些控制器中,您可以这样做:

      app.get('/hey', function(req, res) {
        var payload = req.payload;
      });
      

      【讨论】:

        猜你喜欢
        • 2021-07-30
        • 2019-04-23
        • 1970-01-01
        • 2016-10-09
        • 2020-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-15
        相关资源
        最近更新 更多