Я создаю приложение для паспорта, которое должно искать в базе данных mysql электронную почту и аутентифицировать пользователя, если пароль совпадает. Это мой код:
const express = require("express")
const session = require("express-session");
const bodyParser = require("body-parser");
const { Model, Sequelize, Datatypes } = require("sequelize");
const passport = require("passport");
const LocalStrategy = require("passport-local");
const sequelize = new Sequelize("edit_site", "root", "Ratman4992", {
"host": "localhost",
"dialect": "mysql",
"port": 3306
});
const port = process.env.PORT || 30001
const app = express();
const User = sequelize.define("user", {
"email": {
"type": Sequelize.STRING,
"allowNull": false
},
"password": {
"type": Sequelize.STRING,
"allowNull": false
}
});
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({"extended": true}));
passport.use(new LocalStrategy({
"usernameField": "email",
"passwordField": "password"
},
(email, password, done) => {
User.findOne({"where": { "email": email }}, (error, user) => {
if (error) {
return done(error);
}
if (!user) {
return done(null, false, {"message": "Incorrect username."});
}
if (!user.validPassword(password)) {
return done(null, false, {"message": "Incorrect password."});
}
return done(null, user);
});
}
));
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
app.post('/api/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if (err) {
console.log(err);
return next(err);
}
console.log(info);
if (!user) {
console.log("no user");
return res.redirect('/login');
}
console.log(user);
req.logIn(user, function(err) {
if (err) {
console.log(user);
return next(err);
}
return res.redirect('/users/' + user.email);
});
})(req, res, next);
});
app.post("/api/signup", (req, res) => {
console.log(req.body);
User.create({
"email": req.body.email,
"password": req.body.password
}).then(() => {
res.redirect(307, "/api/login");
}).catch((error) => {
console.log(error);
res.json(error);
});
});
app.use(express.static("public"));
app.use(session({
"secret": "cats",
"resave": false,
"saveUninitialized": true,
"cookie": {"secure": false }
}));
app.use(passport.initialize());
app.use(passport.session());
sequelize.sync().then(() => {
app.listen(port, () => {
console.log("listening to requests on port " + port);
});
});
Публикация в / api / signup успешно создает запись в базе данных. Но при попытке войти с тем же адресом электронной почты и паролем, я получаю только это сообщение в консоли:
Executing (default): SELECT `id`, `email`, `password`, `createdAt`, `updatedAt` FROM `users` AS `user` WHERE `user`.`email` = 'test@gmail.com' LIMIT 1;
И затем проверка на req.user
возвращает false
, когда я жду аутентифицированного пользователя. Почему пользователь не аутентифицируется?
Я использую Express для создания сервера, MySQL 80 для хранения электронной почты, пароля, идентификатора сеанса и т. Д. c., Sequelize для взаимодействия с базу данных и паспорт JS для аутентификации.