我的nodejsexpress和passport应用程序在发布到登录路由时将我重定向到用户对象

问题描述 投票:0回答:1

我使用express mongodb和passportjs设置了一个相当简单的登录应用程序

一切似乎都正常,除了当我发布到登录路由时,我得到用户对象返回给我而不是主页路由,我很困惑,我已经查看了护照文档,但不确定是什么原因造成的.

Server.js 代码

app.use(passport.initialize());
app.use(passport.session());

passport.serializeUser(function (user, done) {
  //console.log('Serialise User Called ' + user.id);
  done(null, user.id)
});
passport.deserializeUser( async function (id, done) {
  try {
    //console.log('Deserilise user called ' + id);
    id = await User.findById(id).exec();
    console.log(id);
    done(id)
  } catch (error) {
    done(error)
  }
});

passport.use(new LocalStrategy(async function (username, password, done) {
    try {
      const user = await User.findOne({ username: username }).exec();
    if(!user) return done(null, false, {message: 'Incorrect username'})
      bcrypt.compare(password, user.password, function (err, res) {
          if (err) return done(err);
            if(res === false) return done(null, false, {message: 'Incorrect Password'})
            console.log('finished localstrategy');
            return done(null, user);
        })
    } catch (error) {
     console.log('Local strat error' + error);
     done(null, error) 
    }

}));

// app.get("/", isLoggedIn, function (req, res) {
//   res.redirect("home");
// });

app.use("/", loginRouter)

app.use("/home", isLoggedIn, homeRouter)

app.use('/register', registerRouter)

app.use('/list', isLoggedIn, listRouter)

app.use('/login', loginRouter)

app.use('/logout', logoutRouter)

app.use('/request', isLoggedIn, requestRouter)

function isLoggedIn(req, res, next) {
  if (req.isAuthenticated()){
    console.log('Authenticated');
    return next();
  }
 console.log('Not authenticated'); 
 res.redirect("/login");
}

login.js 路由器

const express = require('express')
const router = express.Router()
const User = require("../models/User.js");
const bcrypt = require('bcrypt')
var passport = require("passport")

router.get("/", function (req, res) {
    console.log('Login called');
    res.render("login");
  });

router.post("/",function (req, res, next) {
    console.log('Login post called');
    next();
}, passport.authenticate('local', {
    successRedirect: '/home',
    failureRedirect: '/login?error=true'
}));

module.exports = router 

抱歉,如果这个问题非常明显,控制台也会记录以下内容;

{
  _id: new ObjectId("64dfe4319cc137b5818cfeda"),
  username: 'john3',
  password: '$2b$10$lpEwg.KHmAoBFx2bu5WD8.4U/blUB1UZT1r5I4O9lt2kustP6HyNK',
  __v: 0
}
{
  _id: new ObjectId("64dfe4319cc137b5818cfeda"),
  username: 'john3',
  password: '$2b$10$lpEwg.KHmAoBFx2bu5WD8.4U/blUB1UZT1r5I4O9lt2kustP6HyNK',
  __v: 0
}

因此它正在获取用户并验证并在屏幕上显示上述正确的用户,但返回给用户的 html 标题显示错误。

我已经尝试过并记录每个步骤,以确保它按预期运行代码,并且它似乎击中了除主路由之外的所有路由,并提供了用户对象

node.js express authentication passport.js
1个回答
0
投票

回答我自己的问题,

我从 deserializeUser 函数返回用户作为错误而不是 null,

1条简单的线

来自

passport.deserializeUser( async function (id, done) {
  try {
    //console.log('Deserilise user called ' + id);
    id = await User.findById(id).exec();
    console.log(id);
    done(id)
  } catch (error) {
    done(error)
  }
});

passport.deserializeUser( async function (id, done) {
  try {
    //console.log('Deserilise user called ' + id);
    id = await User.findById(id).exec();
    console.log(id);
    **done(null, id)**
  } catch (error) {
    done(error)
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.