на почтальоне получить сессию возвращается, как и ожидалось, на Chrome нет - PullRequest
0 голосов
/ 05 мая 2019

я использую паспорт js express, когда я захожу и получаю req.user на почтальоне, он работает как я ожидаю. Но когда я пытаюсь в веб-браузерах (я делаю запрос get с axios), это не работает. Проблема в том, что passport.deserialize не работает с Axios.

я пробовал разные методы http get request (fetch, jquery.get, axios), не об этом. Также, когда я делаю запрос manuel к моему серверу, это поворачивает как ожидалось У меня другой проект, код почти такой же и работает над этим. Я не могу понять, в чем проблема.

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);
        })

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

ЭТО РЕШЕН, РЕШЕНИЕ ОТВЕТ

1 Ответ

0 голосов
/ 06 мая 2019

Я решил это, решение простое ... Я пытался со вчерашнего дня.

ЗДЕСЬ РЕШЕНИЕ

Работает над отправкой параметра {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);
});
...