passport issue: Cannot read properties of undefined (reading isAuthenticated())

Viewed 232

I have read other questions with similar titles and none of the solutions work for me. I believe the answer I require is probably fundamentally different. I am trying to redirect users that are logged in to the home page when they go to the login since they are already logged in. This is my route for login:

const express = require('express');
const passport = require('passport')
const passportLocal = require('passport-local')
const router = express.Router();

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

router.post('/', passport.authenticate("local", {
    successRedirect: "/",
    failiureRedirect: "/login?error=true"
}));

function isLoggedIn(req, res, next) {
    try {
    if (req.isAuthenticated()) return next();
    res.redirect('/')
    } catch(err){
        res.render('login', { errorMessage : err })
        console.log(`Application has encounted an error\n${err}`)
    }
}

module.exports = router;

This is my app.js:

const express = require('express');
const session = require('express-session');
const passport = require('passport');
const passportLocal = require('passport-local')
const bodyParser = require('body-parser')
const bcrypt = require('bcrypt');
const fetch = (...args) => import('node-fetch').then(({ default: fetch }) => fetch(...args));
const dotenv = require('dotenv').config();
const mongoose = require('mongoose');

var app = express();

mongoose.connect(process.env.DATABASE_URL, { useNewURLParser: true, useUnifiedTopology: true });
var db = mongoose.connection;
db.on("error", console.error.bind(console, "Connection Error:"));
db.once("open", function () {
    console.log("Connected to database");
});

var User = require("./models/user.model");

app.use(express.static(__dirname + "/public", {
    index: false,
    immutable: true,
    cacheControl: true
}));

app.use(express.urlencoded({ extended: false }))

var indexRoute = require('./routes/index.routes');
var loginRoute = require('./routes/login.routes');
var registerRoute = require('./routes/register.routes');

app.use("/", indexRoute)
app.use("/login", loginRoute)
app.use("/register", registerRoute)

app.set('view engine', 'ejs');

var PORT = process.env.PORT || 3000;


app.use(session({
    resave: false,
    saveUninitialized: true,
    secret: process.env.SESSION_SECRET,
    cookie: {
        maxAge: 86400000
    }
}));
app.use(bodyParser.urlencoded({ extended: false }))

app.use(passport.initialize());
app.use(passport.session());
passport.use(new passportLocal((username, password, done) => {
    User.findOne({ username: username }, (err, user) => {
        if (err) { return done(err); }
        if (!user) { return done(null, false); }

        bcrypt.compare(password, user.password, (err, res) => {
            if (err) { return done(err); }
            if (res === false) { return done(null, false, { message: 'Incorrect password.' }); }

            return done(null, user);
        });
    });
}));
passport.serializeUser((user, done) => {
    done(null, user.id);
});
passport.deserializeUser((id, done) => {
    User.findById(id, (err, user) => {
        done(err, user);
    })
});

app.listen(PORT, process.env.IP, function () {
    console.log("server is listening on port " + PORT);
});

I have tried switching around the order of my middleware, and using if(req.session.passport.user !== undefined) to no avail. Let me know if you need more context. Thank you!

0 Answers
Related