我目前正在学习如何使用 Passportjs 和本地策略对用户进行身份验证,我一直在关注这里的教程:https ://scotch.io/tutorials/easy-node-authentication-setup-and-local 。我进行了一些更改以使用 sequelize 而不是 mongoose,现在当我登录时,我被重定向到空白错误页面。
控制台日志显示:
Login Requested
Executing (default): SELECT `id`, `localemail`, `localpassword`,
`facebookid`, `facebooktoken`, `facebookname`, `facebookemail`,
`twitterid`, `twittertoken`, `twitterdisplayname`, `twitterusername`,
`googleid`, `googletoken`, `googleemail`, `googlename`, `createdAt`,
`updatedAt` FROM `Users` AS `User` WHERE `User`.`localemail` =
'test@test.co.uk' LIMIT 1;
User found and logged in: 6
Serializing User: 6
POST /login 302 118.674 ms - 60
Executing (default): SELECT `id`, `localemail`, `localpassword`,
`facebookid`, `facebooktoken`, `facebookname`, `facebookemail`,
`twitterid`, `twittertoken`, `twitterdisplayname`, `twitterusername`,
`googleid`, `googletoken`, `googleemail`, `googlename`, `createdAt`,
`updatedAt` FROM `Users` AS `User` WHERE `User`.`id` = 6;
我相信我已经将问题缩小到调用 serializeUser 函数和呈现页面之前之间的问题,这是我的护照配置文件:
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/user');
const bcrypt= require('bcrypt-nodejs');
passport.serializeUser(function(user, done) {
console.log('Serializing User: ' + user.id);
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.user.findOne({where: {id: id}}).then(function(err, user) {
return done(err, user);
}).catch(function(err) {
return done(err);
});
});
passport.use('local-signup', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true,
},
function(req, email, password, done) {
process.nextTick(function() {
User.user.findOne({where: {localemail: email}}).then(function(user) {
if (user) {
return done(null, false,
req.flash('signupMessage', 'That email is already taken.'));
} else {
let newUser = new User.user();
console.log(newUser);
newUser.localemail = email;
newUser.localpassword = User.generateHash(password);
newUser.save().then(function(user) {
return done(null, user);
}).catch(function(err) {
return done(err);
});
}
}).catch(function(err) {
return done(err);
});
});
}
));
passport.use('local-login', new LocalStrategy({
usernameField: 'email',
passwordField: 'password',
passReqToCallback: true,
},
function(req, email, password, done) {
User.user.findOne({where: {localemail: email}}).then(function(user) {
if (!user) {
console.log('No User found!');
return done(null, false, req.flash('loginMessage', 'No user found'));
}
if (!User.validPassword(password, user)) {
console.log('Incorrect Password');
return done(null, false, req.flash('loginMessage', 'Wrong password.'));
}
console.log('User found and logged in: ' + user.id);
return done(null, user);
}).catch(function(err) {
return done(err);
});
}
));
module.exports = passport;
以及登录和成功重定向的路由:
router.post('/login', function(req, res, next) {
console.log('Login Requested');
next();
}, passport.authenticate('local-login', {
successRedirect: '/profile',
failureRedirect: '/login',
failureFlash: true,
}));
无论我在尝试登录后转到哪个页面、在控制台中重复 SQL 查询和空白错误页面,我都会得到相同的结果。我在stackoverflow上看到了很多类似的问题,但是在 尝试了解决方案之后没有任何效果。
更新
用户型号:
const Sequleize = require('sequelize');
const db = require('../config/database');
const bcrypt= require('bcrypt-nodejs');
let user = db.define('User', {
localemail: Sequleize.STRING,
localpassword: Sequleize.STRING,
facebookid: Sequleize.STRING,
facebooktoken: Sequleize.STRING,
facebookname: Sequleize.STRING,
facebookemail: Sequleize.STRING,
twitterid: Sequleize.STRING,
twittertoken: Sequleize.STRING,
twitterdisplayname: Sequleize.STRING,
twitterusername: Sequleize.STRING,
googleid: Sequleize.STRING,
googletoken: Sequleize.STRING,
googleemail: Sequleize.STRING,
googlename: Sequleize.STRING,
});
db.sync();
exports.validPassword = function(password, user) {
return bcrypt.compareSync(password, user.localpassword);
};
exports.generateHash = function(password) {
return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};
exports.user = user;