我正在尝试在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;
答案 0 :(得分:0)
我最终使用docs中的这段代码解决了这个问题。
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);
});
});
答案 1 :(得分:-1)
重要的是要记住,归根结底,Express是一个中间件应用程序。在POST端点中使用护照的地方对我来说真的没有意义。通常,我会将Passport用作保护端点的中间件,但不能直接在我正在编写的端点中使用。
据我所知,您正在尝试在新用户注册时立即登录。 According to the docs,最惯用的方法是使用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('/');
});
});
});