Прежде чем начать, я очень плохо знаком с паспортом, поэтому наберитесь терпения, пожалуйста. Это второй раз, когда я использую паспорт для аутентификации пользователя, но в отличие от первого раза, я сталкиваюсь с проблемой, когда пользователь получает десериализацию сразу после сериализации и перенаправления на домашнюю страницу. 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!
Я потратил целый день, пытаясь заставить эту работу. Может кто-нибудь помочь мне понять, где я совершил ошибку нуба? Заранее спасибо.