我见过与我类似的问题,但我找不到合适的答案。
我正在尝试使用nodejs + express + passport(本地策略)实现一个非常简单的登录表单。问题是,似乎我的身份验证回调总是失败。我删除了与测试数据库的每个连接(每个教程都有一个示例MongoDB)。
这是我的登录表单
<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 start运行它)
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);
我总是收到失败的身份验证消息。就像我说的那样,我已经删除了与mongoose相关的模式/模型的每个代码,以从MongoDB示例中读取数据。 passport.authenticate回调只返回带有2个字段的对象的done函数,称为用户名和密码,就像护照本地所期望的那样
你能帮助我吗?
答案 0 :(得分:3)
我不相信你正确地调用了回调: 第一个参数需要一个错误或null,第二个参数需要false或用户对象。
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或类似的哈希。