猫鼬忽略

时间:2018-10-11 10:46:01

标签: node.js express mongoose

我有这个User模式:

email: {
    type: String,
    required: true
},
name: {
    type: String,
    required: true
},
password: {
    type: String,
    required: true
}

当您执行POST(/api/user-add)时,我希望所有字段都是必填字段。但是,当我登录(/api/login时,则只需要emailpassword字段。我的问题是,在我的登录代码中,我最终使用了此功能:

staffSchema.methods.generateToken = function(callback) {
    var token = jwt.sign(this._id.toHexString(), config.SECRET);

    this.token = token;
    this.save(function(err, staff) {
        if (err) return callback(err);
        callback(null, staff);
    });
}

在这里它引发错误,因为name字段是必需的。我如何绕过这个。我正在寻找类似的东西:

    this.save(function(err, staff) {
        if (err) return callback(err);
        callback(null, staff);
    }).ignoreRequired('name');

1 个答案:

答案 0 :(得分:1)

使用JWT令牌登录时,这是一个生成token并在没有存储user的情况下验证token的基本示例

注意:

  

不在数据库中存储token的情况下对用户进行身份验证的示例

*登录方式

const jwt = require('./jwt');
userCtr.authenticate = (req, res) => {
  const {
    email, password,
  } = req.body;

  const query = {
    email: email,
  };

  User.findOne(query)
    .then((user) => {
      if (!user) {
        //return error user not found.
      } else {
        if (passwordHash.verify(password, user.password)) { // verify password
            const token = jwt.getAuthToken({ id: user._id });
            const userData = _.omit(user.toObject(), ['password']); // return user data
            return res.status(200).json({ token, userData });
        }

        //return error password not match
      }
    })
    .catch((err) => {
    });
};

* jwt.js

const jwt = require('jwt-simple');
const logger = require('./logger');

const jwtUtil = {};

jwtUtil.getAuthToken = (data) => {
  return jwt.encode(data, process.env.JwtSecret);
};

jwtUtil.decodeAuthToken = (token) => {
  if (token) {
    try {
      return jwt.decode(token, process.env.JwtSecret);
    } catch (err) {
      logger.error(err);
      return false;
    }
  }
  return false;
};

module.exports = jwtUtil;

*使用中间件阻止另一条访问路径

userRouter.post('/update-profile', middleware.checkUser, userCtr.updateProfile);

* middleWare.js

middleware.checkUser = (req, res, next) => {
  const { headers } = req;

  if (_.isEmpty(headers.authorization)) {
    //return error
  } else {
    const decoded = jwt.decodeAuthToken(headers.authorization.replace('Bearer ', ''));
    if (decoded) {
      User.findOne({ _id: decoded.id })
        .then((user) => {
          if (user) {
            req.user = user;
            next();
          } else {
            //error
          }
        })
        .catch((err) => {
          //errror
        });
      req.user = decoded;
    } else {
      //error
    }
  }
};