Muh*_*leh 16 authentication mongodb node.js passport.js
请注意,我是Node.js的初学者,所以请耐心等待我:)
我正在使用Node.js + Express 3 + Passport创建一个简单的身份验证(本地)来玩
到目前为止我已达到的目的是当输入错误的用户名或密码时,用户被重定向到错误页面
但是当用户输入正确的用户名和密码时,我收到此错误
node_modules\mongoose\lib\utils.js:435
throw err;
^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f,
username: 'saleh',
password: '123456' } has no method 'validPassword'
Run Code Online (Sandbox Code Playgroud)
我不确定那里有什么问题
app.js(我删除了不必要的代码):
var passport = require('passport')
, LocalStrategy = require('passport-local').Strategy;
app.configure(function(){
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(passport.initialize());
app.use(passport.session());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
});
var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');
var authSchema = mongoose.Schema({
username: 'string',
password: 'string'
});
var User = db.model('users', authSchema);
passport.use(new LocalStrategy(
function(username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) { return done(err); }
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
app.post('/login',
passport.authenticate('local', { successRedirect: '/',
failureRedirect: '/login/error',
})
);
Run Code Online (Sandbox Code Playgroud)
现在在routes/login.js中
var mongoose = require('mongoose');
var db = mongoose.createConnection('localhost', 'authTest');
var authSchema = mongoose.Schema({
username: 'string',
password: 'string'
});
var User = db.model('users', authSchema);
exports.index = function(req, res){
User.find(function (err, list) {
res.render('login', { title: 'Usernames and Passwords', users: list,msg:""});
});
};
Run Code Online (Sandbox Code Playgroud)
谢谢你的时间.
fre*_*ish 16
嗯,这有点明显,不是吗?您正在使用
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
Run Code Online (Sandbox Code Playgroud)
但是你还没有定义validPassword方法.将其附加到您的架构:
var authSchema = mongoose.Schema({
username: 'string',
password: 'string'
});
authSchema.methods.validPassword = function( pwd ) {
// EXAMPLE CODE!
return ( this.password === pwd );
};
Run Code Online (Sandbox Code Playgroud)
编辑你也错误地定义了架构.它应该是:
var authSchema = mongoose.Schema({
username: String,
password: String
});
Run Code Online (Sandbox Code Playgroud)
请注意这两个username和password应String类型的对象,而不是字符串"string",如果你知道我的意思.:)
ker*_*nic 15
看起来你复制了来自passportjs网站的例子,Jared没有提到如何实现它.
在护照js github页面上,他有另一个(更简单)的例子; 他完全删除了validPassword方法(第18行):
if (user.password != password) { return cb(null, false); }
Run Code Online (Sandbox Code Playgroud)
这就是我的应用程序(使用加密)基于它.
我也是个菜鸟,我花了一整天的时间才弄明白。我使用了 Jared 的另一个示例应用程序的历史记录以及这里人们的一些加密建议。
首先,我创建了一个生成盐的方法(一个字符串化的大随机数),使用盐和用户的密码创建一个哈希(在 nodejs 'crypto' 模块的帮助下),最后存储两个盐以及每次猫鼬保存新帐户之前的哈希值。
//make hash
userSchema.pre('save', function(next) {
var user = this;
if(!user.isModified('password')) return next();
var rand = (Math.floor(Math.random() * 1000000000)).toString(36);
var hash = crypto.createHash('md5').update(user.password + rand).digest("hex");
user.password = hash;
user.salt = rand;
next();
});
Run Code Online (Sandbox Code Playgroud)
为了验证,我只需输入输入的密码(在登录时)并尝试使用盐再次生成相同的哈希值。然后我将存储的哈希值与新的哈希值进行比较,并相应地返回 true 或 false。
// Password verification
userSchema.methods.validPassword = function(password) {
var testhash = crypto.createHash('md5').update(password + this.salt).digest("hex");
if(testhash === this.password) {
return true;
} else {
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11273 次 |
| 最近记录: |