简体   繁体   中英

req.isAuthenticated() returns false after successRedirect

I know that there are numerous posts already referring to the same problem, however, I couldn't find a solution for my case. Here is the relevant code for the issue:

users.js (route) The login form is submits a POST request to this route.

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 The passport authentication is handled here.
req.isAuthenticated() returns false here as well. However, successRedirect is executed, which should mean that the user was successfully authenticated.

'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 (route) Here, ensureAuthenticated always returns 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 When submitting the login form, this code doesn't get executed, because ensureAuthenticated() is 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);
        });
    });
}

All the required middleware is setup in the correct order (express-session -> passport.initialize -> passport.session). cookieParser and express-session are set with the same secret (which is otherwise a problem as other posts suggest).

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());

In your app.js the routes need to be defined after the passpor middleware is set up.

For Example:

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 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());

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

Try doing this and see the output

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM