req.isAuthenticated () возвращает false после successRedirect - PullRequest
0 голосов
/ 07 ноября 2019

Я знаю, что уже есть многочисленные сообщения, относящиеся к одной и той же проблеме, однако я не смог найти решение для своего случая. Вот соответствующий код проблемы:

users.js (маршрут) Форма входа отправляет запрос POST на этот маршрут.

var express = require('express');
var router = express.Router();

// Require controllers
var usersController = require('../../controllers/usersController');

/* POST login */
router.post('/login', usersController.loginAccount);

module.exports = router;

usersController.js Идентификация паспорта обрабатываетсяВот. req.isAuthenticated () также возвращает false здесь. Однако successRedirect выполняется, что должно означать, что пользователь был успешно аутентифицирован.

'use strict';

var bodyParser = require('body-parser');
var mysql = require('mysql');
var bcrypt = require('bcryptjs');
var Client = require('../models/Client');
var passport = require('passport');
var Sequelize = require('sequelize');


var urlencodedParser = bodyParser.urlencoded({ extended: false });

/* POST - Login */

module.exports.loginAccount = function (req, res, next) {
    passport.authenticate('local', {
        successRedirect: '../dashboard',
        failureRedirect: '/users/login',
        failureFlash: true
    }) (req, res, next);
    console.log("Exactly after authentication: " + req.isAuthenticated());
}

index.js (маршрут) Здесь, sureAuthenticated всегда возвращает false

var express = require('express');
var router = express.Router();

// Require controllers
var indexController = require('../../controllers/indexController');

/* GET dashboard page */
router.get('/dashboard', ensureAuthenticated, indexController.dashboardPage);

function ensureAuthenticated(req, res, next) {
    if (req.isAuthenticated())
        {console.log("AUTHENTICATED"); return next();}
    else{
        console.log("NOT AUTHENTICATED");
        req.flash('error_msg', 'Please log in to view this resource');
        res.redirect('/users/login');
    }
}

module.exports = router;

indexController.js Когдапри отправке формы входа в систему этот код не выполняется, так как sureAuthenticated () имеет значение false.

'use strict';

var bodyParser = require('body-parser');
var mysql = require('mysql');

var urlencodedParser = bodyParser.urlencoded({ extended: false });

/* GET - Dashboard page */
module.exports.dashboardPage = function(req, res) {
    // console.log(req.user);
    // console.log(req.isAuthenticated());
    res.render('dashboard');
};

passport.js

const LocalStrategy = require('passport-local').Strategy;
const Sequelize = require('sequelize');
const bcrypt = require('bcryptjs');

// Load User Model
const Client = require('../models/Client');

module.exports = function(passport) {
    passport.use(
        new LocalStrategy({ usernameField: 'username'}, function(username, password, done) {
            // Match User
            Client.findOne({ where: {username: username} })
                .then(function(user) { 
                    if(!user) {
                        return done(null, false, { message: 'That username is not registered'});
                    }

                    // Match password
                    bcrypt.compare(password, user.password, function(err, isMatch) {
                        if(err) throw err;

                        if(isMatch) {
                            return done(null, user);
                        } else {
                            return done(null, false, { message: 'Password incorrect'});
                        }
                    });  
                })
                .catch(function(err) { console.log(err) });
        })
    )

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

    passport.deserializeUser(function(id, done) {
        console.log('Deserializing user');
        console.log('User ID:', id);
        Client.findByPk(id)
        .then(function(err, user) {
            console.log('User ID:', id);
            done(err, user);
        });
    });
}

Все необходимое промежуточное ПО настроено правильнозаказ (экспресс-сессия -> passport.initialize -> passport.session). CookieParser и express-session устанавливаются с одним и тем же секретом (что в противном случае является проблемой, которую предлагают другие сообщения).

app.js

var createError = require('http-errors');
var express = require('express');
var expressLayouts = require('express-ejs-layouts');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var mysql = require('mysql');
var flash = require('connect-flash');
var session = require('express-session');
var passport = require('passport');
var bodyParser = require('body-parser');
var cors = require('cors');

// Passport config
require('./config/passport')(passport);

var usersController = require('./controllers/usersController');
var indexRouter = require('./api/routes/index');
var usersRouter = require('./api/routes/users');
var roomsRouter = require('./api/routes/rooms');

var app = express();

app.use(cors());
// view engine setup
app.set('views', path.join(__dirname, 'views'));
// EJS
app.use(expressLayouts);
app.use(express.json());
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser('secret'));
app.use(express.static(path.join(__dirname, 'public')));

// Express Session
app.use(session({
  secret: 'secret',
  resave: true,
  saveUninitialized: true,
  cookie: { maxAge: 60000 }
}));

// Passport middleware
app.use(passport.initialize());
app.use(passport.session());

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...