【发布时间】:2019-02-08 21:34:00
【问题描述】:
我目前正在学习如何使用 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上看到了很多issuessimilartothis,但是在尝试了解决方案之后没有任何效果。
更新
用户模型:
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;
【问题讨论】:
-
您确定
User.user.findOne()是在反序列化方法中从数据库中获取用户的正确语法吗?不应该是这样User.findOne()吗? -
啊,我在将 generateHash 和 validPassword 函数作为用户模型的一部分时遇到了问题,为了解决这个问题,我正在导出用户模型 (User.user) 和来自用户的 2 个函数模型文件。
-
不明白你在做什么。如果可能,请在此处分享您的用户模型文件
-
我已经更新,包括用户模型
标签: javascript node.js sequelize.js passport.js passport-local