首页 > 解决方案 > 无法使用 Passport 在 Node 中处理登录

问题描述

我正在开发一个简单的 MERN Stack 项目,我需要在其中实现用户登录和注册。我可以注册用户帐户但无法登录系统。尽管我输入的用户名是正确的,但我收到了以下消息。

var app = express();
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static('public'));

app.use(require("express-session")({
    secret: "Rusty is a dog",
    resave: false,
    saveUninitialized: false
}));

app.use(passport.initialize());
app.use(passport.session());
//require('./models/Users')

//passport.use(Users.createStrategy());
//passport.use(new LocalStrategy(Users.authenticate()));
passport.use(new LocalStrategy({
    usernameField: 'email', // this is where you do that
    passwordField: 'password'
},
(email, password, done) => {
    User.findOne({
        email: email
    }, (error, user) => {
        if (error) {
            console.log(error)
            return done(error);
        }
        if (!user) {
            console.log("User not found")
            return done(null, false, {
                message: 'Username or password incorrect'
            });
        }


        // Do other validation/check if any
        console.log("Auth done")
        return done(null, user);
    });
}
));
passport.serializeUser(Users.serializeUser());
passport.deserializeUser(Users.deserializeUser());



/* balance code */


app.post("/login", passport.authenticate("local", {
    successRedirect: "/shop",
    failureRedirect: "/login",
    //failureFlash:true
}), function (req, res) {
    res.redirect('/shop')
}
);

下面是我得到的错误

ctor [MissingUsernameError]: No username was given
    at G:\test1\node_modules\passport-local-mongoose\index.js:231:17
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

标签: node.jsmongodbpassport-local

解决方案


我认为您没有正确使用护照。这里有一个猫鼬的例子在我的系统上工作正常

passport.use(new LocalStrategy({
        usernameField: 'email', // this is where you do that
        passwordField: 'password'
    },
   (email, password, done) => {
        User.findOne({
            email: email
        }, (error, user) => {
            if (error) {
                return done(error);
            }
            if (!user) {
                return done(null, false, {
                    message: 'Username or password incorrect'
                });
            }


            // Do other validation/check if any

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

passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        done(err, user);
    });
});

//对于路由

const forwardAuthenticated = (req, res, next) => {
      if (!req.isAuthenticated()) {
        return next();
      }
      res.redirect('/index.html');      
    }

app.post("/login", forwardAuthenticated, function (req, res) {
        res.redirect('/shop')
 });

推荐阅读