如何使用Passport.js本地策略检查当前密码并(如果正确)更新密码
How to Check Current Password And (If Correct) Update Password Using Passport.js Local Strategy
我需要编写普通代码来检查通过表单提交的当前用户密码值,看看它是否与数据库中的现有密码匹配,如果匹配,则将密码更新为通过相同表单提交的新密码值。
然而,我找不到任何使用Passport.js的好例子。有人能建议我如何在下面的用户控制器中做到这一点吗?如果Passport提供了任何帮助功能,我应该使用这些功能,以及我如何使用哈希和加盐密码?
这是我的代码:
// Form Submitted
req.body = {
_id: '5294198b7b35ad2794000001',
email: 'testusera1@abc.net',
name: 'John Smith',
provider: 'local',
username: 'ab123',
current_password: 'currentpassword',
new_password: 'newpassword'
}
// Route
app.put('/users/me', users.update);
// Controller
var mongoose = require('mongoose'),
User = mongoose.model('User'),
_ = require('underscore'),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy;
exports.update = function(req, res) {
var user = req.user
user = _.extend(user, req.body);
user.save(function(err) {
if(err) { console.log(err) };
res.jsonp(user);
});
};
// Passport Config File
module.exports = function(passport) {
//Serialize sessions
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findOne({
_id: id
}, function(err, user) {
done(err, user);
});
});
//Use local strategy
passport.use(new LocalStrategy({
usernameField: 'email',
passwordField: 'password'
},
function(email, password, done) {
User.findOne({
email: email
}, function(err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, {
message: 'Unknown user'
});
}
if (!user.authenticate(password)) {
return done(null, false, {
message: 'Invalid password'
});
}
return done(null, user);
});
}
));
};
散列和加盐密码
github 的完整示例
// Bcrypt middleware
userSchema.pre('save', function(next) {
var user = this;
if(!user.isModified('password')) return next();
bcrypt.genSalt(SALT_WORK_FACTOR, function(err, salt) {
if(err) return next(err);
bcrypt.hash(user.password, salt, function(err, hash) {
if(err) return next(err);
user.password = hash;
next();
});
});
});
// Password verification
userSchema.methods.comparePassword = function(candidatePassword, cb) {
bcrypt.compare(candidatePassword, this.password, function(err, isMatch) {
if(err) return cb(err);
cb(null, isMatch);
});
};
相关文章:
- 如果 a 为 false,则 if(a) === if(false)
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如果文本字段为空,则使用JavaScript应用CSS样式
- 如果我在javascript中输入无效的电子邮件或空白,如何显示特定的文本框边框红色
- 如果href包含X,请更改href
- 如果localstorage为空,则显示欢迎消息
- 如何使用密码检测网络中的状态连接
- 点击后隐藏潜水?(但如果Div是一面旗帜呢?)
- 一个密码测试程序,如果存在空格,它会提醒用户
- 如何使用Passport.js本地策略检查当前密码并(如果正确)更新密码
- 如果用户在发布之前没有设置密码,请重定向用户
- 如果输入错误的用户名或密码,则显示错误页面
- 角度验证:如果用户输入无效的电子邮件或密码,则限制服务器请求
- 如果散列密码在数据库中,反派可以在登录的输入框中使用该散列密码吗?
- javascript密码匹配,如果不匹配显示在innerHTML
- 如果字段为空,则跳过Javascript密码验证
- 如果用户名有价值,请关注密码字段
- JavaScript密码检查和打开.html文件,如果正确