Node.js快速中间件中的JWT刷新令牌

时间:2018-02-07 11:26:25

标签: node.js api express jwt token

我正在尝试在我的快速中间件中配置令牌刷新方法,因为令牌在每次请求api时都会被验证。我将检查令牌是否过期,如果是,我将使用新的exp日期签署一个新令牌。问题是我必须再次发送令牌,但这样做我丢失了原始请求以发送带有响应的令牌,并且api不会继续到目标端点。 我如何发回新的刷新令牌并继续请求?

我的快速中间件检查令牌:

apiRouter.use(function(req, res, next) {
      var token = req.body.token || req.query.token || req.headers['x-access-token'];
      if (token) {
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {
          if (err) {
            //Here I can check if the received token in the request expired
            if(err.name == "TokenExpiredError"){
                var refreshedToken = jwt.sign({
                    success: true,
                    }, app.get('superSecret'), {
                        expiresIn: '5m'
                    });
                //Here need to send the new token back to the client and continue with the request
                //but if I use return res.... the request don't continue to next()
                next();
              }else if (err) {
                return res.json({ success: false, message: 'Failed to authenticate token.' });
              }         
          } else {
            //If no error with the token, continue 
            next();
          };
        });
      } else {
        return res.status(403).send({
            success: false,
            message: 'No token provided.'
        });
      }
    });

我不知道它是否是最好的方法。

谢谢你。

1 个答案:

答案 0 :(得分:1)

对于单个请求,您无法向客户端发送两次响应,因此更好的方式将发送带有实际API响应的访问令牌。

apiRouter.use(function(req, res, next) {
      var token = req.body.token || req.query.token || req.headers['x-access-token'];
      if (token) {
        jwt.verify(token, app.get('superSecret'), function(err, decoded) {
          if (err) {
            //Here I can check if the received token in the request expired
            if(err.name == "TokenExpiredError"){
                var refreshedToken = jwt.sign({
                    success: true,
                    }, app.get('superSecret'), {
                        expiresIn: '5m'
                    });
                request.apiToken = refreshedToken;
                next();
              }else if (err) {
                return res.json({ success: false, message: 'Failed to authenticate token.' });
              }         
          } else {
            //If no error with the token, continue 
            request.apiToken = token;
            next();
          };
        });
      } else {
        return res.status(403).send({
            success: false,
            message: 'No token provided.'
        });
      }
    });

然后当您发送回复然后发送带有令牌的回复,您可以通过request.apiToken获得回复。

但更好的策略是提供客户端刷新令牌,让客户端请求刷新令牌。

您可以详细了解here