Passport JS req.user 未定义

Posted

技术标签:

【中文标题】Passport JS req.user 未定义【英文标题】:Passport JS req.user is undefined 【发布时间】:2021-12-27 04:05:02 【问题描述】:

我在其他地方看到过这个问题,但是,这些解决方案似乎都不适合我。在尝试控制台记录 req.session 和 req.user 时,我返回了会话,如下所示,但是,req.user 返回为未定义。我相信在序列化用户时存在问题,因为 VS 代码提醒我在 passport.serialUser 函数中“类型用户上不存在“'id' 属性”,但它控制台正确记录 user.id(我的对象 id用户文档)。

如果有人知道可能导致 user.id 属性不存在/用户未定义的原因,我将不胜感激。

passport.js 文件:

const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcrypt");
const User = require("../models/User");

const verifyCallback = (username, password, done) => 
  User.findOne( username: username )
    .then((user) => 
      if (!user) 
        return done(null, false);
      

      // Validate Password
      bcrypt.compare(password, user.password).then((isMatch) => 
        if (isMatch) 
          return done(null, user);
         else 
          return done(null, false);
        
      );
    )
    .catch((err) => 
      done(err);
    );
;

const strategy = new LocalStrategy(verifyCallback);

passport.use(strategy);

passport.serializeUser((user, done) => 
  done(null, user.id);
);

passport.deserializeUser((userId, done) => 
  User.findById(userId)
    .then((user) => 
      done(null, user);
    )
    .catch((err) => done(err));
);

index.js 文件:

  session(
    secret: process.env.SECRET,
    resave: false,
    saveUninitialized: true,
    store: sessionStore,
    cookie: 
      maxAge: 1000 * 60 * 60 * 24,
    ,
  )
);

// Passport Auth Middleware
const passportConfig = require("./config/passport");

// Initialize Passport and Use Session for Serialize/Deserialization
app.use(passport.initialize());
app.use(passport.session());

app.use((req, res, next) => 
  console.log(req.session);
  console.log(req.user);
  next();
);

控制台日志:

  cookie: 
    path: '/',
    _expires: 2021-11-17T02:08:23.650Z,
    originalMaxAge: 86400000,
    httpOnly: true
  

undefined

用户文档示例:

"_id":"$oid":"6186c13beb18d33d5088f7b2",
"username":"coolguy9",
"password":"$2b$13$4p5apH8Q8k8hP4WpCNt6/O40M9I0jlkG.LXIE3d/V89Kmtmk1plxa",
"firstname":"Bob",
"lastname":"Woodhull",
"team":"Warehouse",
"createdAt":"$date":"$numberLong":"1636221243904",
"updatedAt":"$date":"$numberLong":"1636221243904",
"__v":"$numberInt":"0"```

【问题讨论】:

【参考方案1】:

解决了这个问题。在包含 axios 实例的前端的 loginAPI.js 文件中,我需要包含选项 withCredentials: true

例子:

  baseURL: "http://localhost:8000/api/",
  timeout: 1000,
  withCredentials: true,
);

【讨论】:

以上是关于Passport JS req.user 未定义的主要内容,如果未能解决你的问题,请参考以下文章

Node + Express + Passport + Mongoose:req.user 未定义

req.user.displayname 未定义 Nodejs + passport = google oauth

Passport.js、会话和反应 |从 /login 路由以外的任何路由访问 req.user 是未定义的

连续登录后未定义 Passport context.req.user (express/graphql)

使用 google-passport-oauth 登录后 req.user 未定义

Passport + NodeJs + Express 得到“req.user”未定义