使用node / express和passport.js无法登录并且没有错误消息

时间:2018-11-08 19:10:59

标签: node.js mongodb express passport.js ejs

我注册没有问题,但是尝试登录时,所有页面都会刷新而没有错误消息。

这是登录表单(我正在使用ejs)

<form class="" action="/login" method="post">
      <h1>Login</h1>
      <div class="EmailAddress">
        <input type="text" name="email" placeholder="Email">
      </div>
      <div class="Password">
        <input type="password" name="password" placeholder="Password">
      </div>
      <div class="Login">
        <input type="submit" value="submit">
      </div>
    </form>  

我为两种不同类型的用户创建了两个模型,一个是运营商,一个是客户,它们实际上是相同的,并且可以很好地进行注册。目前,我仅尝试登录客户,所以这里是我的 passport.js 文件:

编辑:我已经根据下面的zerosand1s更新了它,但仍然无法正常工作。

  module.exports = function(passport) {
  //LocalStrategy
  passport.use(
    new LocalStrategy(
      { passReqToCallback: true },
      {
        usernameField: "email",
        passwordField: "password"
      },
      function(req, email, password, done) {
        let query = { email: email };
        // checking the name in the database against the one submitted on the form
        Customer.findOne(query, function(err, customer) {
          if (err) throw err;
          if (!customer) {
            return done(null, false, {
              message: "No such password",
              type: "error"
            });
          }
          //Match password
          bcrypt.compare(password, customer.password, function(err, isMatch) {
            if (err) throw err;
            if (isMatch) {
              return done(null, customer);
            } else {
              return done(null, false, {
                message: "No such password",
                type: "error"
              });
              // if the password isnt an matc return wrong password
            }
          });
        });
      }
    )
  );
};

  passport.serializeUser(function(customer, done) {
    done(null, customer.id);
  });

  passport.deserializeUser(function(id, done) {
    Customer.findById(id, function(err, customer) {
      done(err, customer);
    });
  });

这里是我的路线文件,用于登录 index.js

// login route
router.get("/login", function(req, res) {
  res.render("login", {message: req.flash('error')});
});

// login Process
router.post("/login", function(req, res, next) {
  passport.authenticate('local', {
    // were using the LocalStrategy used in config/passport file
    successRedirect:'../customer/dashboard',
    failureRedirect:'/login',
    failureFlash: true
  })(req, res, next);
});

router.get("/customer/dashboard", function(req, res) {
  res.render("customer/dashboard");
});

我认为可能存在问题的唯一地方是我的 app.js 文件:

// Express session
app.use(session({
  secret: 'keyboard cat',
  resave: true,
  saveUninitialized: true,
  cookie: { secure: true }
}));

// Express messages middleware
app.use(require('connect-flash')());
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  // setting a global variable called express-messages
  next();
});

// Express validator middleware
app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));

app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

// Passport Config
require('./config/passport')(passport);
// Passport Middleware
app.use(passport.initialize());
app.use(passport.session());

app.get('*', function(req, res, next) {
  res.locals.customer = req.customer || null;
  next();
});

app.use(cookieparser());


// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }))
// parse application/json
app.use(bodyParser.json())

app.listen(3000, function() {
  console.log('server is running');
});
app.use(flash());
app.use(routes);

我整天都在扯头发,因此非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

由于您使用email进行登录(而不是默认的username),因此需要在Passport本地策略中进行指定。

从Passport文档中,

  

默认情况下,LocalStrategy期望在参数中找到凭证   命名的用户名和密码。如果您的网站更喜欢命名这些字段   不同的是,可以使用选项来更改默认值。

passport.use(new LocalStrategy({
    passReqToCallback: true
    usernameField: 'email',
    passwordField: 'passwd'
  },
  function(username, password, done) {
    // ...
  }
));