在邮递员上按预期获得会话 returns,在 chrome 上没有

on postman get session returns as expected, on chrome not

我正在使用 passport js express,当我登录并在邮递员上获得 req.user 时,它按我预期的方式工作。但是当我尝试使用网络浏览器时(我正在使用 axios 获取请求)它不起作用。问题是 passport.deserialize 在 axios get 上不起作用。

我尝试了不同的 http get 请求方法(fetch、jquery.get、axios),这与此无关。此外,当我向我的服务器发出手动请求时,它会按预期进行。我有不同的项目,代码几乎相同并且可以在上面工作。我不明白这是什么问题。

app.use(
  session({
    secret: 'fraggle-rock', //pick a random string to make the hash that is generated secure
    store: new MongoStore({ mongooseConnection: db }),
    resave: false, //required
    saveUninitialized: false, //required
  })
);

app.use(passport.initialize());
app.use(passport.session());
passport.use(
  new LocalStrategy(
    {
      usernameField: 'username', // not necessary, DEFAULT
    },
    function(username, password, done) {
      User.findOne({ username: username }, (err, user) => {
        if (err) {
          return done(err);
        }
        if (!user) {
          return done(null, false, { message: 'Incorrect username' });
        }
        if (!user.checkPassword(password)) {
          return done(null, false, { message: 'Incorrect password' });
        }
        return done(null, user);
      });
    }
  )
);
app.post('/login', passport.authenticate('local'), (req, res) => {
  console.log('logged in', req.user);
  var userInfo = {
    username: req.user.username,
  };
  res.send(userInfo);
});
app.get('/user', (req, res, next) => {
  console.log('===== userss!s!======');
  console.log(req.user);
  res.send(req.user);
  /* if (req.user) {
    res.json({ user: req.user });
  } else {
    res.json({ user: null });
  }*/
});

护照序列化和反序列化

const passport = require('passport');
const User = require('../database/models/user');

// called on login, saves the id to session req.session.passport.user = {id:'..'}
passport.serializeUser((user, done) => {
  if (!user) {
    console.log('no user');
  } else {
    console.log('*** serializeUser called, user: ');
    console.log(user); // the whole raw user object!
    console.log('---------');
    done(null, { _id: user._id });
  }
});

// user object attaches to the request as req.user
passport.deserializeUser((id, done) => {
  console.log('------------------DeserializeUser called');
  User.findOne({ _id: id }, 'username', (err, user) => {
    if (err) {
      console.log(err);
    } else {
      console.log('*** Deserialize user, user:');
      console.log(user);
      console.log('--------------');
      done(null, user);
    }
  });
});

AXIOS


axios.get('http://localhost:8000/user')
        .then(function(response) {
          console.log(response);
        })
        .catch(function(error) {
          console.log(error);
        })

-------------------------------------------- --------------------------

我解决了这个,答案上的解决方案


我解决了这个问题,解决方案很简单...我从昨天开始就在尝试。

这是解决方案

正在努力将 {withCredentials:true} 参数与来自前端的每个请求一起发送,以便前端将 cookie 与每个请求一起发送。

在后端添加了以下代码:

app.use(cors());

app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "frontendURL");
res.header("Access-Control-Allow-Credentials", true);
res.header(
"Access-Control-Allow-Headers",
"Origin, X-Requested-With, Content-Type, Accept"
);
next();
});

登录句柄的前端请求示例:

const login_axios = axios.create({
withCredentials: true,
headers: {
Accept: "application/json",
"Content-Type": "x-www-form-urlencoded"
},
params: {
username: this.state.username,
password: this.state.password
}
});
login_axios
.post()
.then(function(response) {
console.log("RESPONSE");
console.log(response);
})
.catch(function(error) {
console.log("ERROR");
console.log(error);
});