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

时间:2017-05-16 08:23:32

标签: node.js express token jwt

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

当我进行登录并且一切正常时,服务器向我发送一个令牌,该令牌存储在设备SharedPreference上,现在我的困惑是,我是否需要在每个请求上解码此令牌,或者我是否需要执行此操作它只有一次?

最后在this tutorial中的

,他在令牌的每条路线上进行解码,但是当我做注册请求时,我不需要这样做。

实施此方法的最佳方法是什么?

这是我的服务器代码:

//****************************************************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;

1 个答案:

答案 0 :(得分:0)

如果您不想对所有路线使用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.'
    });

  }
}