node.js - successRedirect 不适用于 Passport 登录passport-local

标签 node.js express sequelize.js passport.js passport-local

我正在使用带有 sequelize 和数据库 postgreSql 的 node.js express。问题在于 Passport 登录失败重定向工作正常 sucessRedirect 没有重定向到我想要的页面。它仍在加载并且没有响应任何内容并且没有出现任何错误。
当我提交登录时,它会检查错误,如果有错误,它会在 failureRedirect 中完美运行,但在 Success 中它不起作用,就像页面加载只是不会转到目标页面,如果我停止项目并重新启动项目,它将在目标中页!!我不知道是什么问题帮助我。
主 Controller .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);
    });
  });
};
索引.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!");
});

最佳答案

问题已经解决了,我在 deserializeUser 中做了错误的代码。
之前的passport.js

  passport.deserializeUser((id, done) => {
    masterUser.findByPk(id, (err, user) => {
      done(err, user);
    });
  });
};
之后的passport.js
     passport.deserializeUser(function (id, done) {
    masterUser.findOne({ where: { id: id } }).then((user) => {
      done(null, user);
    });
  });
问题是 sequelize 获取用户数据是不同的,所以现在它对我有用。这对于使用带有 sequelize 的 express 和带有 postgresql 的通行证的人很有用

关于node.js - successRedirect 不适用于 Passport 登录passport-local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63737321/

相关文章:

javascript - 为什么我的 SQL 代码中出现语法错误?

node.js - 为什么 Zombie.js 不能与 Google Charts 一起使用?

javascript - 使用 Nodejs 的 Moment.js Sql 日期时间转换

node.js - 我无法理解 websockets(通过 socket.io 和 node.js)

javascript - 国外收藏似乎没有出现在聚合数据中

node.js - passport.use jwt 传递角色参数

java - 如何使用套接字与socketio交互

javascript - 设备用户代理检测| Node.js | express 用户代理 |解析数据

node.js - Sequelize `findOne` 工作不如预期

sequelize.js - 在创建后的 Sequelize 中添加响应 "val": "CURRENT_TIMESTAMP" instance of time(2019-03-22 09:56:38)