'Passport.js authentication goes in infinite loop

I have been trying to build the authentication using PassportJs and MongoDB. I am using PassportJS only to log in. But, while submitting the post request it does not redirect me to the failureRedirect route, nor to the SuccessRedirect one, instead, the web page enters into an endless loop. The code I have written is -

It has 2 files- app.js and user.js
App.js file -

const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const passport = require('passport');
const mongoose = require('mongoose');
require('./db/db')
var fileupload = require('express-fileupload');
const path = require('path');

const app = express();
app.use(fileupload({
  useTempFiles: true
}));
const session = require('express-session');
const mongostore = require('connect-mongo');
app.use(express.static(path.join(__dirname,'public')));
// session middle ware
app.use(session({
  secret : 'mysupersecret',
  resave : false,
  saveUninitialized : false,
  store: mongostore.create({
    mongoUrl: process.env.DB,
}),
  cookie : { maxAge : 180 * 60 * 1000 }
}));


app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static("public"));
app.use(bodyParser.json());

app.use(passport.initialize());
app.use(passport.session());

app.get("/", (req, res) => {
  res.render("index");
});

app.use("/admin", require("./routes/admin"));
app.use("/user", require("./routes/user"));
app.use("/task", require("./routes/task"));

// PORT
const PORT = process.env.PORT || 5000;
app.listen(PORT, console.log(`Server started on port ${PORT}`));

User.js file -

const express = require("express");
const bodyParser = require("body-parser");
const router = express.Router();
const bcrypt = require("bcryptjs");
const passport = require("passport");

const User = require("../models/User");
const Task = require("../models/Task");

var LocalStrategy = require('passport-local');

// var bcrypt = require('bcryptjs');
var strategy = new LocalStrategy(function verify(email, password, done) {
  try{
      console.log(email);
  User.findOne({email: email}, function (err, user) {
    console.log(email);
      if (err)
          console.log(err);

      if (!user) {
        console.log("doen exist")
          return done(null, false);
      }

      bcrypt.compare(password, user.password, function (err, isMatch) {
          if (err)
              console.log(err);

          if (isMatch) {
              return done(null, user);
          } else {
            console.log("galat password");
              return done(null, false);
          }
      });
  });
  }catch(err){
    console.log(err);
  }
});

passport.use('epass',strategy);

passport.serializeUser((user, done) => {
  done(null, user);
});

passport.deserializeUser((user, done) => {
  done(null, user);
});

// User login
router.get("/login", (req, res) => {
  res.render("user-login");
});


router.post("/login", (req,res) => {
  try{
  passport.authenticate('epass', { failureRedirect: '/user/login' }),
  function(req, res,next) {
    res.redirect('/user');
  }
}catch(err){
  console.log(err);
}
}); 

router.get("/", (req, res) => {
  res.render("user")
})

module.exports = router;

I have searched everywhere and tried all the available possible solutions but nothing is solving this.



Solution 1:[1]

passport.authenticate() should be used as a middleware, not as a regular function:

router.post("/login",
  passport.authenticate('epass', { failureRedirect: '/user/login' }),
  function(req, res,next) {
    res.redirect('/user');
  }
);

The way you were using it causes the request to POST /user/login to never finish, because it's not sending back any response.

EDIT: also, make sure that you either use the default field names of username and password for logging in, or add the relevant options to the constructor of LocalStrategy to tell it which fields it should be expecting.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1