Десериализация паспорта сразу после перенаправления логина - PullRequest
0 голосов
/ 29 января 2020

Прежде чем начать, я очень плохо знаком с паспортом, поэтому наберитесь терпения, пожалуйста. Это второй раз, когда я использую паспорт для аутентификации пользователя, но в отличие от первого раза, я сталкиваюсь с проблемой, когда пользователь получает десериализацию сразу после сериализации и перенаправления на домашнюю страницу. Passport аутентифицирует пользователя правильно, успешно использует 'successRedirect', и при входе в консоль пользователь дает мне объект Sequelize, как и ожидалось, сразу после входа в систему. Однако он сразу десериализуется и req.user становится неопределенным, мне нужна помощь, чтобы понять, почему .

Я использую PostgreSQL с sequelize вместо MongoDB, поэтому я внес несколько изменений в примеры, найденные в документации. Может быть, я ошибаюсь? Вот мой код:

Приложение. js:

const dotenv = require('dotenv').config();
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var sassMiddleware = require('node-sass-middleware');

var flash = require('connect-flash');
var passport = require('passport');
var session = require('express-session');
var init = require('./config/passport-config');

init(passport);

var indexRouter = require('./routes/index');
var authenticationRouter = require('./routes/authentication');
var usersRouter = require('./routes/users');
var profileRouter = require('./routes/profile.js');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(sassMiddleware({
    src: path.join(__dirname, 'public'),
    dest: path.join(__dirname, 'public'),
    indentedSyntax: false, // true = .sass and false = .scss
    sourceMap: true
}));
app.use(express.static(path.join(__dirname, 'public')));

app.use(session({
    secret: "randomkeyword",
    resave: false,
    saveUninitialized: false
}));
app.use(passport.initialize());
app.use(flash());
app.use(passport.session());

app.use('/', indexRouter);
app.use('/autenticacao', authenticationRouter);
app.use('/usuarios', usersRouter);
app.use('/minhaconta', profileRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

Моя конфигурация паспорта:

const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const users = require('../models').users;
const bcrypt = require('bcryptjs');

//Strategies
module.exports = function init(passport) {

    passport.serializeUser(function(user, done) {
        console.log(`Serializing ${user.id}!`);
        done(null, user.id);
    });

    passport.deserializeUser(function(id, done) {
        users.findOne({where:{id:id}})
            .then(user => {
                console.log(`De-serializing ${user.id}!`);
                done(null, user);
            })
            .catch(err =>done(err));
    });

    passport.use(new LocalStrategy(
        function(username, password, done){ // Verify callback
            users.findOne({where:{usuario:username}})
                .then(user => {
                    if (!user){
                        console.log('incorrect username');
                        return done(null, false, {message:'Usuário incorreto!'});

                    }
                    if (!bcrypt.compareSync(password, user.senha)){

                        console.log('incorrect password');
                        return done(null, false, {message:'Senha incorreta!'});

                    }

                    console.log(`user é ${user.usuario}`);
                    return done(null, user);
                })
                .catch(err => done(err));
        }
    ));
}

В аутентификации. js:

const express = require('express');
const passport = require('passport');

const router = express.Router();

router.get('/login', (req, res) => {
    res.render('login');
});

router.post('/login', passport.authenticate('local', {
    successRedirect: '/',
    failureRedirect: '/autenticacao/login',
    failureFlash: true
}));

Когда вы входите в систему как 'Foobar', вывод консоли:

Executing (default): SELECT "id", "usuario", "email", "senha", "isAdmin", "createdAt", "updatedAt" FROM "users" AS "users" WHERE "users"."usuario" = 'Foobar';
user é Foobar
Serializing f757baa4-cfd5-4187-b1bb-d379e9edc82b!
POST /autenticacao/login 302 657.576 ms - 46
Executing (default): SELECT "id", "usuario", "email", "senha", "isAdmin", "createdAt", "updatedAt" FROM "users" AS "users" WHERE "users"."id" = 'f757baa4-cfd5-4187-b1bb-d379e9edc82b';
De-serializing f757baa4-cfd5-4187-b1bb-d379e9edc82b!
GET / 200 137.271 ms - 2801
GET /stylesheets/style.css 200 75.333 ms - 2007
GET /images/svg/cart.svg 304 1.771 ms - -
GET /favicon.ico - - ms - -
Executing (default): SELECT "id", "usuario", "email", "senha", "isAdmin", "createdAt", "updatedAt" FROM "users" AS "users" WHERE "users"."id" = 'f757baa4-cfd5-4187-b1bb-d379e9edc82b';
De-serializing f757baa4-cfd5-4187-b1bb-d379e9edc82b!

Я потратил целый день, пытаясь заставить эту работу. Может кто-нибудь помочь мне понять, где я совершил ошибку нуба? Заранее спасибо.

...