我正在构建一个需要在登录期间进行身份验证的应用程序,并且我使用了护照(本地护照)。应用程序不会为登录部分运行,并且在删除所有语法错误后可用的最后一个选项是我使用护照的方式(在他们的文档中给出)是用于猫鼬而我正在使用sequelize。有人可以告诉我如何纠正我的passport.js文件,以便它也适用于续集吗? (通过sequelize使用mysql;数据库已经填充) 这是我的passport.js文件
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const Users = require('./db').Users
module.exports = function (passport) {
console.log("passport is working");
passport.serializeUser(function (users, done) {
console.log("Serialize");
done(null, users.id)
})
function findById(id, fn) {
User.findOne(id).exec(function (err, user) {
if (err) {
return fn(null, null);
} else {
return fn(null, user);
}
});
}
passport.deserializeUser(function (id, done) {
console.log("DeSerialize");
findById(id, function (err, user) {
console.log(user);
done(err, user);
});
})
passport.use(new LocalStrategy(
function (username, password, done) {
Users.findOne({ where: { username: username } },
function (err, users) {
if (err) { return done(err); }
if (!users) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!users.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, users);
});
}
));
}
这是我的db.js文件
const Sequelize = require('sequelize');
const db = new Sequelize(
'mydb',
'myuser',
'mypass',
{
dialect: 'mysql',
host: 'localhost',
pool: {
max: 8,
min: 0,
aquire: 30000,
idle: 10000
},
}
);
const Users = db.define('users', {
email: {
type: Sequelize.STRING,
allowNull: false,
unique: true
},
username: {
type: Sequelize.STRING,
allowNull: false,
unique: true,
},
password: {
type: Sequelize.STRING,
allowNull: false,
}
})
db.sync().then(() => console.log("Database is ready"))
exports = module.exports = {
db,
Users
}
另外,作为旁注,我可以使用passport.authenticate在发布请求后进行res.send吗?
app.post('/login', passport.authenticate('local'),
function(req, res) {
res.send({
url:'/profile',
username:req.body.username
});
});
提前感谢!!
答案 0 :(得分:0)
是的,您需要更改提取用户的功能。这个:
function findById(id, fn)
应该是这样的:
function findById(id, fn) {
User.findById(id).then((user) {
return fn(null, user);
});
}
你还需要改变一下:
passport.use(new LocalStrategy(
function (username, password, done) {
Users.findOne({ where: { username: username } })
.then((user) => {
if (!user) {
return done(null, false, { message: '' });
}
// validate your password**
return done(null, user);
});
}
));
如果你想使用像user.validatePassword()
这样的函数,你需要定义一个实例方法(检查续集文档)或here
答案 1 :(得分:0)
product = 'apples'
已被Sequelize 4中的findById
方法取代。
http://docs.sequelizejs.com/class/lib/model.js~Model.html#static-method-findByPk