首页 > 解决方案 > ExpressJS:无法使用passport.js登录

问题描述

这是我第一次passportexpressJS项目中使用。

我面临一个问题。当我尝试登录时,我正在提交我的数据并且应用程序总是无法通过身份验证。

我的app.js文件包括与护照相关的这些:

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

// Login
app.post('/users/login', (req, res, next) => {
   passport.authenticate('local', {
         successRedirect: '/dashboard',
         failureRedirect: '/users/login',
         failureFlash: false
   })(req, res, next);
});

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

// Express body parser
app.use(express.urlencoded({ extended: false }));

我还有一个passport.js位于config目录(/config/passport.js)中的文件

在这个文件中,我创建了我的 LocalStrategy,它负责登录身份验证的成功或失败。

passport.js文件里面我有:

const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";`

module.exports = function(passport) {
    console.log('check if printing-- it is printing')
    passport.use(
        new LocalStrategy({ usernameField: 'email' }, (email, password, done) => {
            console.log('check if printing-- it is not printing')
            // Match user
            MongoClient.connect(url, function(err, db) {
                var dbo = db.db("chat_db");
                dbo.collection('users').findOne({
                email: email
                }).then(user => {
                    if (!user) {
                        console.log('That email is not registered');
                    //   return done(null, false, { message: 'That email 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(function(user, done) {
       done(null, user.id);
   });

   passport.deserializeUser(function(id, done) {
      MongoClient.connect(url, function(err, db) {
        var dbo = db.db("chat_db");
        dbo.collection('users').findById(id, function(err, user) {
            done(err, user);
        });
      });
   })
};

我相信问题存在于passport.use(...)代码部分中,但我无法弄清楚。我console.log()在代码中放置了两个测试,以检查是否调用了哪些方法。我还测试了这dbo.collection('users').findOne()部分,它确实通过提供的电子邮件找到了数据,所以我想这没有问题。

谁能帮我这个?我不知道为什么passport.use(...)没有被调用,所以登录总是失败并总是将我重定向到登录页面,而不是仪表板。非常感谢您的帮助,感谢您的宝贵时间。

标签: node.jsexpressauthenticationpassport.jsexpress-4

解决方案


您在路由之后加载您的护照/正文解析器中间件,因此它们永远不会被您的登录路由调用。他们需要首先被定义。此外,您定义路线的方式似乎与文档建议的不同,并且可以这样简化:

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

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

// Express body parser
app.use(express.urlencoded({ extended: false }));

// Login
app.post('/users/login',
  passport.authenticate('local', {
    successRedirect: '/dashboard',
    failureRedirect: '/users/login',
    failureFlash: false
  })
);

推荐阅读