Javascript 使用环回实现密码更改
我正在尝试使用Loopback的内置方法实现更改密码功能,它工作正常,但它不会使用Javascript 使用环回实现密码更改,javascript,node.js,loopbackjs,strongloop,Javascript,Node.js,Loopbackjs,Strongloop,我正在尝试使用Loopback的内置方法实现更改密码功能,它工作正常,但它不会使用哈希更新密码,而只是在数据库中保存一个纯文本。我正在这个项目中使用环回组件passportnpm包。我已经搜索了很多网站,但是我找不到实现这个功能的正确方法。有人知道怎么做吗 //Change user's pasword app.post('/change-password', function(req, res, next) { var User = app.models.user; if (!req.
哈希更新密码,而只是在数据库中保存一个纯文本。我正在这个项目中使用环回组件passport
npm包。我已经搜索了很多网站,但是我找不到实现这个功能的正确方法。有人知道怎么做吗
//Change user's pasword
app.post('/change-password', function(req, res, next) {
var User = app.models.user;
if (!req.accessToken) return res.sendStatus(401);
//verify passwords match
if (!req.body.password || !req.body.confirmation ||
req.body.password !== req.body.confirmation) {
return res.sendStatus(400, new Error('Passwords do not match'));
}
User.findById(req.accessToken.userId, function(err, user) {
if (err) return res.sendStatus(404);
user.hasPassword(req.body.oldPassword, function(err, isMatch) {
if (!isMatch) {
return res.sendStatus(401);
} else {
user.updateAttribute('password', req.body.password, function(err, user) {
if (err) return res.sendStatus(404);
console.log('> password change request processed successfully');
res.status(200).json({msg: 'password change request processed successfully'});
});
}
});
});
});
使用源代码中看到的内置
//Hash the plain password
user.updateAttribute('password', User.hashPassword(req.body.password), function(err, user) {
...
});
这实际上是环回数据源juggler 2.45.0引入的一个bug。默认情况下,应该对密码进行哈希处理
因此,如果您使用user.hashpassword,那么在将来的版本中它可能不起作用,因为如果操作不正确,它可能会散列已散列的pw,但是应该已经检查长度加上检查$2$,或者检查散列值的起始位
编辑:安装loopback datasource juggler的2.45.1,它应该是固定的。以下是我的“完整”解决方案,用于在loopback/StrongLoop-IBM项目中实现特定的updatePassword远程方法。
请验证loopback-datasource-juggler
包的版本高于或等于2.45.1(npm-list-loopback-datasource-juggler
)。
我的用户模型称为MyUserModel
,它继承自内置模型user
:
“我的用户模型.js”
“我的用户模型.json”
注意:使用MyUserModel上的PUT请求,只需在正文中指定{“password”:“…newpassword…”即可执行相同的功能。但是,为了对新密码实施安全策略,使用特定的远程方法可能比使用此技巧更方便
有了这个,我得到了TypeError:user.hashPassword不是一个函数
我缺少什么?我使用了user.hashPassword(req.body.password)
,它就像一个符咒一样工作。。非常感谢你@VickyGonsalves不客气,当你在环回中找不到什么东西时,一定要检查源代码,这有助于创建建议Medet!重要!小写的“user”是实际登录的用户实例,“user”是模型类型,谢谢。。我不知道!
module.exports = function (MyUserModel) {
...
MyUserModel.updatePassword = function (ctx, emailVerify, oldPassword, newPassword, cb) {
var newErrMsg, newErr;
try {
this.findOne({where: {id: ctx.req.accessToken.userId, email: emailVerify}}, function (err, user) {
if (err) {
cb(err);
} else if (!user) {
newErrMsg = "No match between provided current logged user and email";
newErr = new Error(newErrMsg);
newErr.statusCode = 401;
newErr.code = 'LOGIN_FAILED_EMAIL';
cb(newErr);
} else {
user.hasPassword(oldPassword, function (err, isMatch) {
if (isMatch) {
// TODO ...further verifications should be done here (e.g. non-empty new password, complex enough password etc.)...
user.updateAttributes({'password': newPassword}, function (err, instance) {
if (err) {
cb(err);
} else {
cb(null, true);
}
});
} else {
newErrMsg = 'User specified wrong current password !';
newErr = new Error(newErrMsg);
newErr.statusCode = 401;
newErr.code = 'LOGIN_FAILED_PWD';
return cb(newErr);
}
});
}
});
} catch (err) {
logger.error(err);
cb(err);
}
};
MyUserModel.remoteMethod(
'updatePassword',
{
description: "Allows a logged user to change his/her password.",
http: {verb: 'put'},
accepts: [
{arg: 'ctx', type: 'object', http: {source: 'context'}},
{arg: 'emailVerify', type: 'string', required: true, description: "The user email, just for verification"},
{arg: 'oldPassword', type: 'string', required: true, description: "The user old password"},
{arg: 'newPassword', type: 'string', required: true, description: "The user NEW password"}
],
returns: {arg: 'passwordChange', type: 'boolean'}
}
);
...
};
{
"name": "MyUserModel",
"base": "User",
...
"acls": [
...
{
"comment":"allow authenticated users to change their password",
"accessType": "EXECUTE",
"property":"updatePassword",
"principalType": "ROLE",
"principalId": "$authenticated",
"permission": "ALLOW"
}
...
],
...
}