【问题标题】:How to access req.user from session cookie using passport.js如何使用 passport.js 从会话 cookie 访问 req.user
【发布时间】:2022-08-06 22:07:42
【问题描述】:

我正在尝试将当前用户存储在反应状态,以便更好地管理为登录用户获取数据。在后端,创建和验证用户正常工作,我可以访问 req.user,但是,当我尝试创建特定路由以返回当前用户时,req.user 未定义。两个调用的 cookie 看起来也不同,其中一个附加了护照属性,而另一个没有。

会话设置:

app.use(session({
  secret: process.env[\"SECRET\"], 
  resave: false,
  saveUninitialized: true,
  store: MongoStore.create({mongoUrl: process.env[\"MONGO_URI\"]
}), //Connects session store to cookie
  cookie: {
    maxAge: 1000 * 60 * 60 * 24 * 31 //Setting cookie to last around a month
  }
}));

初始化护照:

require(\"./config/passport\");
app.use(passport.initialize());
app.use(passport.session());

配置/护照文件:

const passport = require(\"passport\");
const LocalStrategy = require(\"passport-local\").Strategy;
const User = require(\"../config/database\").user;
const validatePassword = require(\"../lib/passwordUtils\");

const verifyUserCallback = (email, password, done) => {
  User.findOne({email: email})
    .then((user) => {
      if(!user){
        return done(null, false); //Returns 401. Should be handled
      }
      const isValid = validatePassword(password, user.hash, user.salt);
      
      if(isValid){
        return done(null, user)
      } else{
        return done(null, false); //Credentials are not valid
      }
    })
      .catch((err) => {
        done(err);
      });
};

const strategy = new LocalStrategy({usernameField: \"email\"}, verifyUserCallback);
passport.use(strategy);

passport.serializeUser((user, done) => { //Persists data after session
  done(null, user.id)
});

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

从登录文件访问 req.user 可以正常工作:

router.post(
  \"/login\",
  passport.authenticate(\"local\"),
  (req, res) => {
    if(req.user){
      console.log(req.user)
      console.log(req.session)
      res.status(200).json({user: req.user})
    } else{
      res.status(401).json({error: \"Username and password do not match\"})
    }
  }
);

注册用户:

router.post(\"/register\", (req, res) => {
  const saltHash = genPassword(req.body.password);
  const salt = saltHash.salt;
  const hash = saltHash.hash;

  //Going to see if user exists
  User.findOne({email: req.body.email}).then((user) => {
    if(!user){ //If there is no current user make a new one
      const newUser = new User({
        name: req.body.name,
        email: req.body.email,
        age: req.body.age,
        salt: salt,
        hash: hash
      });
      newUser.save().then((user) => {
        req.isAuthenticated = true; //Pretty sure this works
        res.status(200).json({user: user})
      });
    } else{
      //User exists
      req.isAuthenticated = false;
      res.status(401).json({error: \"User already exists\"})
    }
  }).catch(err => console.log(err));
});

但是 checkAuthentication 文件是问题所在。它没有正确返回 req.user 而是说它是未定义的。

router.get(\"/checkAuthentication\", (req, res) => {
  console.log(req.user) //Undefined
  if(req.isAuthenticated){
    res.status(200).json({user: req.user})
  } else{
    res.status(401).json({user: \"User is not logged in\"})
  }
});

两人的饼干看起来也不同。以下是用户刚刚登录时的示例 cookie:

Session {
  cookie: {
    path: \'/\',
    _expires: 2022-06-23T23:14:13.366Z,
    originalMaxAge: 2678400000,
    httpOnly: true
  },
  passport: { user: \'628bf9107d0bbe14b560609d\' }
}

当经过身份验证但不仅仅是登录或注册时:

Session {
  cookie: {
    path: \'/\',
    _expires: 2022-06-23T23:15:04.343Z,
    originalMaxAge: 2678400000,
    httpOnly: true
  }
}

    标签: node.js reactjs passport.js session-cookies express-session


    【解决方案1】:

    面临同样的问题,有什么解决办法吗?

    【讨论】:

    猜你喜欢
    • 2012-08-28
    • 2018-07-26
    • 2015-01-28
    • 1970-01-01
    • 2011-06-17
    • 2020-11-18
    • 2011-03-16
    • 2020-11-03
    • 2012-07-08
    相关资源
    最近更新 更多