【问题标题】:How can i pass data from middleware to router?如何将数据从中间件传递到路由器?
【发布时间】:2021-07-29 18:07:16
【问题描述】:

我们在 getpost 路由器中有 authenticateToken 中间件。 authenticateToken 中间件验证令牌。

如果令牌已过期,则执行 if(err) 条件语句。这时候通过refreshtoken再次发出accessToken。

我想将这个发出的 accessToken 传递给路由器。 console.log(accessToken);如何修复代码来执行此操作?

这是我的代码

(index.js)

    router.post('/getpost', authenticateToken, async (req, res, next) => {
      try {
        console.log(accessToken);
      } catch (error) {
        console.error(error);
        next(error); // status 500
      }
    });

(中间件.js)

      exports.authenticateToken = (req, res, next) => {

        jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, async (err, user) => {
          if (err) {
            jwt.verify(
              refreshToken,
              process.env.REFRESH_TOKEN_SECRET,
              async (err, user) => {
                if (err) return res.sendStatus(403);
                const accessToken = await generateAccessToken(users); // i want to pass this  accessToken to router
                console.log('accessToken::::', accessToken);
            
              },
            );
            res.json({accessToken: accessToken});
          }
          req.user = user;
          next();
        });
      };

      function generateAccessToken(user) {
        return jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, {expiresIn: '55s'});
      }




    app.post("/token", (req, res) => {
      const refreshToken = req.body.token;
      console.log("refreshToken:", refreshToken);
      if (refreshToken == null) return res.sendStatus(401);
      if (!refreshTokens.includes(refreshToken)) return res.sendStatus(403);
      jwt.verify(refreshToken, process.env.REFRESH_TOKEN_SECRET, (err, user) => {
        if (err) return res.sendStatus(403);
        const accessToken = generateAccessToken({ name: user.name });
        res.json({ accessToken: accessToken });
      });
    });

【问题讨论】:

  • 你能用你更新的本地代码更新有问题的代码吗,所以我可以帮助你解决你尝试过的问题

标签: javascript node.js reactjs react-native jwt


【解决方案1】:

我认为你可以这样做

exports.authenticateToken = (req, res, next) => {

        jwt.verify(token, process.env.ACCESS_TOKEN_SECRET, async (err, user) => {
          if (err) {
            jwt.verify(
              refreshToken,
              process.env.REFRESH_TOKEN_SECRET,
              async (err, user) => {
                if (err) return res.sendStatus(403);
                const accessToken = await generateAccessToken(users); // i want to pass this  accessToken to router
                // Adding token to the req object
                req.accessToken = accessToken
                // Added this
                next()
              },
            );

            res.json({accessToken: accessToken});
          } else { 
            req.user = user;
            next();
          }
        });
      };

      function generateAccessToken(user) {
        return jwt.sign(user, process.env.ACCESS_TOKEN_SECRET, {expiresIn: '55s'});
      }

您使用 req 对象传递令牌,并像这样在路由中获取令牌

router.post('/getpost', authenticateToken, async (req, res, next) => {
      try {
        // Access the token through req object
        console.log(req.accessToken);
      } catch (error) {
        console.error(error);
        next(error); // status 500
      }
    });

编辑:根据相关代码编写示例

【讨论】:

  • @jackvolten 我编辑了答案,请查看
  • 我再试一次,但出现了这个错误:accessToken is not defined
  • @jackvolten accessToken 未定义,因为jwt.verify(...) 是异步的,并且在设置 accessToken 之前调用了next()。我再次编辑了答案,在第一个回调中添加了else 语句,在刷新令牌回调中添加了next() 调用。
  • 哦,谢谢!有用!!!但我想知道有必要吗? res.json({accessToken: accessToken});??????
  • 我的建议是另一种方法来刷新过期的访问令牌。我如何理解,您的中间件的功能是检查访问令牌是否有效,并保护您的路由,这就是它应该做的,只有这样,如果令牌有效,一切正常,请求继续,如果没有,则返回 403。
猜你喜欢
  • 2016-03-05
  • 2019-07-26
  • 2015-08-06
  • 2018-01-06
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2017-08-24
相关资源
最近更新 更多