【问题标题】:How to get access to whole user object in passport如何访问护照中的整个用户对象
【发布时间】:2021-02-27 17:34:07
【问题描述】:

我正在学习使用护照的快速身份验证并对前端做出反应,我有一个问题。我如何访问整个经过身份验证的用户对象?我有看起来像这样的 db 模型

const userSchema = new mongoose.Schema({
    username: {type:String,required:true },
    password: {type:String ,required:true},
    note: {type:String}
})

我的passportConfig.js

const userSchema = require("./user");
const bcrypt = require("bcryptjs");
const localStrategy = require("passport-local").Strategy;

module.exports = function (passport) {
  passport.use(
    new localStrategy((username, password, done) => {
      userSchema.findOne({ username: username }, (err, user) => {
        if (err) throw err;
        if (!user) return done(null, false);
        bcrypt.compare(password, user.password, (err, result) => {
          if (err) throw err;
          if (result === true) {
            return done(null, user);
          } else {
            return done(null, false);
          }
        });
      });
    })
  );

  passport.serializeUser((user, cb) => {
    cb(null, user.id);
  });
  passport.deserializeUser((id, cb) => {
    userSchema.findOne({ _id: id }, (err, user) => {
      const userInformation = {
        username: user.username,
      };
      cb(err, userInformation);
    });
  });
};

我的登录请求和用户请求

app.post('/login',(req,res,next) => {
   passport.authenticate("local",(err,user,info) =>{
       if (err) throw err
       if(!user) res.send("No user with given login")
       else {
           req.logIn(user, (err) => {
               if (err) throw err
               res.send("Succesfully Authenticated")
           })
       }
   })(req,res,next)
})


app.get('/user',(req,res) => {
  res.send(req.user)
})

现在反应过来我想访问我记录的用户笔记,我这样做了

const signIn = () => {
    const user = {
      username: login,
      password: password
    }

    Axios({
      method: "POST",
      data: user,
      withCredentials: true,
      url: "http://localhost:4000/login",
    }).then((res) => {
      console.log(res)
      getNotes()
    });
      
    
  }

const getNotes = () => {
    Axios({
      method: "GET",
      withCredentials: true,
      url: "http://localhost:4000/user",
    }).then((res) => {
      setNotes(res.data);
      console.log(res);
    });
  }

在我的 getNotes 响应 console.log 中,我想拥有所有已登录的用户对象,但我只得到了他的用户名。如何访问他的笔记?

【问题讨论】:

    标签: javascript reactjs express passport.js passport-local


    【解决方案1】:

    req.user 是根据passport.deserializeUser 中的逻辑设置的。您可以更新 deserializeUser 以在用户对象中存储更多数据。

    notes 传递给创建的req.user 对象的示例:

    passport.deserializeUser((id, cb) => {
      userSchema.findOne({ _id: id }, (err, user) => {
        const userInformation = {
          username: user.username,
          notes: user.notes
        };
        cb(err, userInformation);
      });
    });
    

    【讨论】:

    • 不客气!如果我的回答有帮助,您能否将其标记为已接受?
    猜你喜欢
    • 2016-05-23
    • 2017-11-03
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多