Nodejs Passportvalidationcallback没有被错误地调用

我看过类似的问题,但我找不到正确的答案。

我试图用nodejs + express +护照(本地策略)实现一个非常简单的login表单。 事情是,我的身份validationcallback似乎总是失败。 我已经删除了testing数据库的每个连接(每个教程都有一个示例MongoDB)。

这是我的login表单

<html> <body> <form action="/login" method="post"> <div> <label>Username:</label> <input type="text" name="username" /> <br/> </div> <div> <label>Password:</label> <input type="password" name="password" /> </div> <div> <input type="submit" value="Submit" /> </div> </form> </body> </html> 

这是我的server.js(我运行npm启动)

 var express = require('express'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var app = express(); var port = process.env.PORT || 8080; app.use(passport.initialize()); app.use(passport.session()); passport.use(new LocalStrategy(function(username, password, done) { // no authentication logic here... just return done with an object with 2 fields return (done, {username : username, password : password}); })); passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(obj, done) { done(null, obj); }); // ROUTES // ============================================== // sample route with a route the way we're used to seeing it app.post('/login', passport.authenticate('local', { successRedirect: '/loginSuccess', failureRedirect: '/loginFailure' }) ); app.get('/login', function(req, res) { res.sendfile('views/login.html'); }); app.get('/loginFailure', function(req, res, next) { res.send('Failed to authenticate'); }); app.get('/loginSuccess', function(req, res, next) { res.send('Successfully authenticated'); }); // START THE SERVER // ============================================== app.listen(port); console.log('Magic happens on port ' + port); 

我总是无法validation消息。 正如我所说的,我已经剥离了与mongoose有关的模式/模型的每个代码来读取来自示例MongoDB的数据。 passport.authenticatecallback函数只是返回一个带有2个字段的对象的done函数,这个字段被称为username和password,就像passport-local

你可以帮我吗?

我不相信你正在调用callback:第一个参数期望一个错误或空,第二个期望假,或用户对象。

 passport.use(new LocalStrategy(function(username, password, done) { // no authentication logic here... just return done with an object with 2 fields done(null, {username : username, password : password}); })); 

或者,使用db:

 passport.use(new LocalStrategy(function(username, password, done) { db.users.findOne({ username : username}, function(err, user){ if(err) return done(err); if(!user || user.password !== password) return done(null, false); done(null, user); }); }); 

在这里,您可以看到我们比较密码,然后用用户对象进行响应,然后通过护照库将其附加到req.user。 当然,你不会比较两个密码,而是使用bcrypt或类似的哈希。