【问题标题】:How to Pass data from express middleware directly back to client JWT and Express middleware如何将数据从 express 中间件直接传递回客户端 JWT 和 Express 中间件
【发布时间】:2021-09-06 12:37:03
【问题描述】:

我目前被困在尝试使用 express 中间件、react 和 JWT 实现刷新令牌。我遇到的问题是我需要将刷新的令牌从中间件函数传递回客户端。我尝试使用 res.locals.variableName 和 res.set,但是一旦中间件函数完成并调用 next(),我会在我的路由中使用 res.json 进行响应,我认为这会覆盖我在来自中间件的响应。如何在仍然能够调用 next() 的同时将此刷新令牌返回到客户端?

app.all('*',  function (req, res, next) {

  const headerToken = req.headers.token;
  const refreshToken = req.headers.refreshtoken;
  const isVerifiedPath = verifyPaths(unauthorizedPaths, currentPath);


  if (isVerifiedPath) {
    next()
  }
  else {
    jwt.verify(headerToken, process.env.KEY, async (err, data) => {
      if (err) {
        if (err.expiredAt) { // expired web token
          jwt.verify(refreshToken, process.env.KEY, async (err, data) => {
            if (data) {
              const User = require('./models/User');
              const user = await User.query().findById(data.user.id);
              const token = jwt.sign({ user }, process.env.KEY, { expiresIn: 5 });
              req.user = user;
              res.locals.varName = token; // I would like this to be accessible from the response my api returns
              next();
            }
          })
        }
        else {
          return res.status(401).json({ err: 401 });
        }
      }
      else {
        req.user = data.user;
        next();
      }
    });
  }
});

【问题讨论】:

  • 您希望如何访问res.locals.varName?您的路线如何使用res.locals,那里会覆盖什么?
  • 在 res.set 或 res.locals.varName 设置之后,如果我 console.log(res) 它就在那里。在 next() 之后调用的路由中也是如此。但是,在 next() 之后调用的路由中,我返回 res.json(random stuff) 并且我希望响应包含 refreshToken 并且可以从客户端访问。问题是它一旦返回客户端就不存在了。我假设它被 res.json() 覆盖,会是这样吗? @Bergi
  • 您希望它如何发送给客户?作为头条?作为身体的一部分? res.locals 通常与视图引擎一起使用,而不是原始 json 响应。
  • 啊,我不知道。但是是的,我想成为正文或标题的一部分,而不是将其包含在 next() 之后调用的路由中。我有很多路由,所以理想情况下,如果可能的话,我希望它从中间件函数附加到响应对象。 @Bergi
  • 如果你想作为header发送,只需从中间件发送header即可。要将其作为正文的一部分发送,路由需要合作。

标签: javascript node.js express jwt middleware


【解决方案1】:

我的问题的解决方案是通过这样的标头传递令牌。我无法查看令牌客户端,因为我没有公开标头(第 2 行)。

res.set('x-token', token);
res.set('Access-Control-Expose-Headers', 'x-token');

【讨论】:

    猜你喜欢
    • 2018-12-11
    • 2017-04-02
    • 2018-12-18
    • 1970-01-01
    • 2018-01-06
    • 2017-08-26
    • 1970-01-01
    • 2018-04-13
    • 2015-03-03
    相关资源
    最近更新 更多