2012-11-26 23 views
13

Xin lưu ý rằng tôi là người mới bắt đầu ở Node.js vì vậy hãy kiên nhẫn với tôi :)Node.js và Passport Object không có phương thức validPassword

Tôi đang sử dụng Node.js + Express 3 + Passport để tạo ra một xác thực đơn giản (địa phương) chỉ để chơi xung quanh

và những gì tôi đã đạt được cho đến nay rằng khi một username hoặc password sai vào dùng được chuyển hướng đến một trang lỗi

nhưng khi người dùng nhập vào một đúng tên người dùng và mật khẩu Tôi nhận được lỗi này

node_modules\mongoose\lib\utils.js:435 
    throw err; 
     ^
TypeError: Object { _id: 50b347decfd61ab9e9e6768f, 
username: 'saleh', 
password: '123456' } has no method 'validPassword' 

Tôi không chắc chắn có chuyện gì đó

app.js (tôi loại bỏ các mã không cần thiết):

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', 

            }) 
); 

và bây giờ trong các tuyến đường/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:""}); 
    }); 
}; 

Cảm ơn bạn đã dành thời gian.

Trả lời

11

Vâng, đây là loại hiển nhiên, phải không? Bạn đang sử dụng

if (!user.validPassword(password)) { 
    return done(null, false, { message: 'Incorrect password.' }); 
} 

nhưng bạn chưa xác định phương pháp validPassword. Gắn nó vào giản đồ của bạn:

var authSchema = mongoose.Schema({ 
    username: 'string', 
    password: 'string' 
}); 
authSchema.methods.validPassword = function(pwd) { 
    // EXAMPLE CODE! 
    return (this.password === pwd); 
}; 

EDIT Bạn tôi cũng không đúng quy định giản đồ. Nó nên là:

var authSchema = mongoose.Schema({ 
    username: String, 
    password: String 
}); 

Lưu ý rằng cả hai usernamepassword nên String đối tượng loại, không dây "string", nếu bạn biết những gì tôi có ý nghĩa. :)

+0

Cảm ơn :) nó hoạt động ngay bây giờ –

+0

Một câu hỏi khác nếu bạn có thể .. bạn có thể giới thiệu cho tôi sách hoặc tài nguyên để tìm hiểu Node.js tốt hơn không? –

+1

@MuhammadSaleh Tôi không biết bất kỳ cuốn sách Node.JS nào. Tôi đã học được mọi thứ bằng cách liên tục googling. Bắt đầu với hướng dẫn trên [Trang chính Node.JS] (http://nodejs.org/). Và sau đó chỉ cần google. Stackoverflow cũng là một nguồn kiến ​​thức tuyệt vời. Đó là cách tôi đã học được nó. – freakish

11

Hình như bạn đã sao chép ví dụ từ trang web passportjs, nơi Jared thất bại trong việc đề cập đến làm thế nào để thực hiện nó ..

Trên trang github js hộ chiếu ông có khác (đơn giản) ví dụ; ông lấy ra validPassword phương pháp hoàn toàn (dòng 18):

Example

if (user.password != password) { return cb(null, false); } 

Đó là những gì tôi có trụ sở ứng dụng của tôi trên (sử dụng mã hóa) trên đầu trang của nó.

+0

Cảm ơn tôi thực sự cần một ví dụ đơn giản hơn và tôi cũng đã liên lạc với Jared để tạo một tài liệu tốt hơn :) –

4

Cũng là một noob vào lúc này, tôi mất cả ngày để tìm ra điều này. Tôi đã sử dụng lịch sử từ một ứng dụng ví dụ khác của Jared và một số lời khuyên về mật mã từ những người ở đây. Trước tiên tôi đã tạo ra một phương pháp tạo ra một muối (một số ngẫu nhiên lớn được xâu chuỗi), sử dụng muối và mật khẩu của người dùng để tạo ra một băm (với sự trợ giúp của mô-đun 'crypto' của nodejs), và cuối cùng là lưu trữ cả muối và băm mỗi lần trước khi mongoose lưu một tài khoản mới.

//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(); 
}); 

Để xác minh, tôi chỉ cần nhập mật khẩu đã nhập (khi đăng nhập) và thử lại cùng một lần nữa bằng muối. Sau đó tôi so sánh băm được lưu trữ với giá trị mới và trả về true hoặc false cho phù hợp.

// 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; 
     } 
    } 
+0

Khoảnh khắc đó khi bạn nhận ra đây là một năm tuổi. – Rorschach120

+0

Không sao đâu :) Cảm ơn sự đóng góp –

Các vấn đề liên quan