Почему мое приложение для паспорта не аутентифицирует пользователей? - PullRequest
0 голосов
/ 16 апреля 2020

Я создаю приложение для паспорта, которое должно искать в базе данных 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 для аутентификации.

1 Ответ

0 голосов
/ 18 апреля 2020

Как это? без последнего (req, res, next)

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);
        });
    });
});
...