我正在尝试在Node/MongoDB应用程序中设置本地用户身份验证。
这是有问题的文件。我不能让passport.authenticate('local')
开火。我已经尝试了使用next()
的不同变体,并将 passport.authenticate 作为单独的回调调用,但它仍然没有注册。
我也在使用https
并且适当地使用bodyparser
...
router.post('/join', function(req, res, next) {
const {email, password} = req.body;
User.register(new User({
username:email,
email: email
}),password,function(err,account){
if (err){
console.log('err',err);
}
console.log('here') // works
passport.authenticate('local', function(err,user,info){
console.log('am i here'); // does not work
res.redirect('/');
});
});
});
作为参考,这是我的其他安装文件。
server.js
...
app.use(session({
secret: 'ama-app',
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
app.use('/', routes);
var User = require('./models/User');
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
下面我有用户架构的文件设置
models/User.js
var mongoose = require('mongoose');
var passportLocalMongoose = require('passport-local-mongoose');
const UserSchema = new mongoose.Schema({
username:String,
email: String,
password: String
});
UserSchema.plugin(passportLocalMongoose);
var User = mongoose.model('User', UserSchema);
module.exports = User;
最终通过使用文档中的这段代码解决了这个问题。
router.post('/join', function(req, res, next) {
const {email, password} = req.body;
User.register(new User({
username:email,
email: email
}),password,function(err,account){
if (err){
console.log('err',err);
}
passport.authenticate('local', function(err, user, info) {
if (err) {
return next(err);
}
if (!user) {
// redirects successfully
return res.redirect('/');
}
})(req, res, next);
});
});
重要的是要记住,归根结底,Express 是一个中间件应用程序。您在 POST 端点中使用护照的地方对我来说并没有意义。通常我会使用 Passport 作为中间件来保护端点,但不会直接在我正在编写的端点中。
据我所知,您正在尝试在新用户注册时立即登录。根据文档,最惯用的方法是使用 req.login()
.
以下是我希望你做的事情:
router.post('/join', function(req, res, next) {
const {email, password} = req.body;
User.register(new User({
username:email,
email: email
}),password,function(err,account){
if (err){
console.log('err',err);
// IMPORTANT: need to return here
return next(err);
}
req.login(account, function(err) {
if (err) { return next(err); }
return res.redirect('/');
});
});
});