Node.js 在每个请求上检查Jwt令牌?

Node.js 在每个请求上检查Jwt令牌?,node.js,express,token,jwt,Node.js,Express,Token,Jwt,我正在用nodejs和postgreSQL开发一个android应用程序,目前我只有登录和注册 当我登录并且一切正常时,服务器向我发送一个令牌,该令牌存储在设备SharedReference上,现在我的困惑是,我是否需要在每次请求时解码该令牌,还是只需要解码一次 最后,他在每条路由上解码令牌,但我不需要这样做,例如当我请求注册时 实现这一点的最佳方式是什么 这是我的服务器代码: //****************************************************Begin

我正在用nodejs和postgreSQL开发一个android应用程序,目前我只有登录和注册

当我登录并且一切正常时,服务器向我发送一个令牌,该令牌存储在设备SharedReference上,现在我的困惑是,我是否需要在每次请求时解码该令牌,还是只需要解码一次

最后,他在每条路由上解码令牌,但我不需要这样做,例如当我请求注册时

实现这一点的最佳方式是什么

这是我的服务器代码:

//****************************************************Begin of login request **********************************/
router.post('/login', function (req, res, next) {
    if (JSON.stringify(req.body) == "{}") {
        return res.status(400).json({ Error: "Login request body is empty" });
    }
    if (!req.body.username || !req.body.password) {
        return res.status(400).json({ Error: "Missing fields for login" });
    }

    // search a user to login
    User.findOne({ where: { username: req.body.username } }) // searching a user with the same username and password sended in req.body
        .then(function (user) {
            if (user && user.validPassword(req.body.password)) {
                //return res.status(200).json({ message: "loged in!" }); // username and password match


                var payload = { user: user };

                // create a token
                var token = jwt.sign(payload, 'superSecret', {
                    expiresIn: 60 * 60 * 24
                });


                // return the information including token as JSON
                res.json({
                    success: true,
                    message: 'Enjoy your token!',
                    token: token
                });

            }
            else {
                return res.status(401).json({ message: "Unauthorized" }); // if there is no user with specific fields send
            }
        }).catch(function (err) {
            console.error(err.stack)
            return res.status(500).json({ message: "server issues when trying to login!" }); // server problems
        });
});
//****************************************************End of Login request **********************************/



//****************************************************Begin of register request******************************/
router.post('/register', function (req, res, next) {

    if (JSON.stringify(req.body) == "{}") {
        return res.status(400).json({ Error: "Register request body is empty" });
    }
    if (!req.body.email || !req.body.username || !req.body.password) {
        return res.status(400).json({ Error: "Missing fields for registration" });
    }

    var password = User.generateHash(req.body.password);


    User.create({
        username: req.body.username,
        email: req.body.email,
        password: password
    }).then(function () {
        return res.status(200).json({ message: "user created" });
    }).catch(function (err) {
        return res.status(400).send({ message: err.message }); // 
    }).catch(function (err) {
        return res.status(400).json({ message: "issues trying to connect to database" });
    })

});
//****************************************************End of register request **********************************/



module.exports = router;

如果不想对所有路由使用JWT令牌检查,可以跳过这些路由

const url = require('url');

apiRoutes.use((req, res, next) => {
  const path = url.parse(req.url).pathname;
  console.log(path);

  //No JWT token check
  if (/^\/register/.test(path)) {
    return next();
  }

  return jwtTokenValidate();
});

function jwtTokenValidate() {
  // check header or url parameters or post parameters for token
  var token = req.body.token || req.query.token || req.headers['x-access-token'];

  // decode token
  if (token) {

    // verifies secret and checks exp
    jwt.verify(token, app.get('superSecret'), function(err, decoded) {
      if (err) {
        return res.json({ success: false, message: 'Failed to authenticate token.' });
      } else {
        // if everything is good, save to request for use in other routes
        req.decoded = decoded;
        next();
      }
    });

  } else {

    // if there is no token
    // return an error
    return res.status(403).send({
      success: false,
      message: 'No token provided.'
    });

  }
}