node.js - 猫鼬忽略必需
问题描述
我有这个User
架构:
email: {
type: String,
required: true
},
name: {
type: String,
required: true
},
password: {
type: String,
required: true
}
当您执行 POST ( /api/user-add
) 时,我希望所有字段都是必需的。但是当我登录(/api/login
)时,我只需要email
andpassword
字段。我的问题是,在我的登录代码中,我最终得到了这个功能:
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');
解决方案
当您使用令牌登录时,这是一个无需存储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
}
}
};
推荐阅读
- php - 将跟踪 id 从表 2 的列复制到表 1 的列
- reactjs - 命名空间声明不能位于与其合并的类或函数之前
- jmeter - Jmeter-线程组-线程属性
- python-2.7 - Python:在reportlab的顶部添加徽标
- amazon-web-services - 如何在 cloudformation 内的安全组中使用 EC2 ip 地址
- python - read_csv 在某些列中跳过分隔符
- html - Angular 4 - 在 HTML 模板中添加日期到日期
- c# - 将新项目添加到列表中以替换列表中的旧项目
- excel - 共享工作簿的列宽不变
- java - 递归检索二叉搜索树的子集