Search code examples
node.jsexpresssequelize.jspassport.jspassport-local

successRedirect is not working in passport login passport-local


I am using node.js express with sequelize and database postgreSql.the problem is in passport login failureRedirect works properly sucessRedirect does not redirect to the page that I want. It still loading and not responding anything and does not come any error.

when I submit login it will check for errors if errors it will work perfectly in failureRedirect but in Success it does not work like page has loading only not goes to the destination page and if I stop the project and restart the project it will be in destination page!! i dont know what is the problem help me.

mainController.js

const express = require("express");
const sessions = require("express-session");
require("../model/MasterUser.model");
const passport = require("passport");
var session = sessions;

const router = express.Router();

router.get("/dashboard", (req, res) => {
 res.render('dashboard');
});

router.get("/login", (req, res) => {
  res.render("login", { layout: "login.hbs" });
});

router.post(
  "/login",
  passport.authenticate("local", {
    successRedirect: "/main/dashboard",
    failureRedirect: "/main/login",
    failureFlash: true,
  })
);


module.exports = router;

passport.js

const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcryptjs");
const sequelize = require("sequelize");
const masterUser = require("../model/MasterUser.model");

module.exports = function (passport) {
  passport.use(
    new LocalStrategy(
      { usernameField: "user_name" },
      (user_name, password, done) => {
        // Match user
        masterUser.findOne({ where: { user_name: user_name } }).then((user) => {
          if (!user) {
            return done(null, false, {
              message: "This username is not registered",
            });
          }

          // Match password
          bcrypt.compare(password, user.password, (err, isMatch) => {
            if (err) throw err;
            if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: "Password incorrect" });
            }
          });
        });
      }
    )
  );

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

  passport.deserializeUser((id, done) => {
    masterUser.findByPk(id, (err, user) => {
      done(err, user);
    });
  });
};

index.js

const express = require("express");
const Handlebars = require("handlebars");
var flash = require("connect-flash");
const app = express();
const path = require("path");
const bodyparser = require("body-parser");
const expressHandlebars = require("express-handlebars");
const passport = require("passport");
const sessions = require("express-session");
var session = sessions;
const MainController = require("./controllers/MainController");
const db = require("./config/database");

//test db
db.authenticate()
  .then(() => console.log("Database Connected..."))
  .catch((err) => console.log("error" + err));

//for security purpose
const cors = require("cors");

app.use(
  cors()
);

//Passport Config
require("./config/passport")(passport);

app.use(cookieParser());
//use body parser
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({ extended: true }));

const {
  allowInsecurePrototypeAccess,
} = require("@handlebars/allow-prototype-access");

app.use(
  bodyparser.urlencoded({
    urlencoded: true,
  })
);

app.use(
  sessions({
    secret: "secret_key",
    resave: false,
    saveUninitialized: true,
    cookie: { maxAge: 60000 },
  })
);

// use flash for show messages
app.use(flash());

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

//flash messages
app.use((req, res, next) => {
  res.locals.success_msg = req.flash("success_msg");
  res.locals.error_msg = req.flash("error_msg");
  res.locals.error = req.flash("error");

  next();
});

//setting up view Engine
app.set("views", path.join(__dirname, "/views"));

//using the hbs
app.engine(
  "hbs",
  expressHandlebars({
    extname: "hbs",
    defaultLayout: "default",
    layoutsDir: __dirname + "/views/layouts",
    handlebars: allowInsecurePrototypeAccess(Handlebars),
  })
);

app.set("view engine", "hbs");

//route for Main
app.use("/main", MainController);



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

app.listen(3000, () => {
  console.log("App listening on port 3000!");
});

Solution

  • the problem has been solved guys I made done wrong code in deserializeUser.

    passport.js before

      passport.deserializeUser((id, done) => {
        masterUser.findByPk(id, (err, user) => {
          done(err, user);
        });
      });
    };
    

    passport.js after

         passport.deserializeUser(function (id, done) {
        masterUser.findOne({ where: { id: id } }).then((user) => {
          done(null, user);
        });
      });
    

    the problem is for sequelize get the user data is different so now its worked for me.this is useful for who using express with sequelize and passport with postgresql