Razzle: Пересылка клиентских файлов cookie в API при вызове с сервера

Созданный на 5 апр. 2016  ·  16Комментарии  ·  Источник: jaredpalmer/razzle

Извините, если это вопрос новичков. Что происходит, когда для вызова API требуется сеанс пользователя. Я предполагаю, что эти файлы cookie сеанса не будут перенаправлены в конечную точку API, когда рендеринг происходит на стороне сервера?

Любая идея о том, как мне пересылать файлы cookie пользователя в конечную точку API. Думаю, это будет где-то внутри HttpClient.js?

Спасибо

Самый полезный комментарий

@omnidan Я который предоставил

  getWithToken: (path, token) => new Promise((resolve, reject) => {
    request
      .get(getUrl(path))
      .set('X-User-Token', token)
      .accept('application/json')
      .end((err, res) => {
        if (err) {
          reject(err);
        } else {
          resolve(res.body);
        }
      });
  })

Все 16 Комментарий

@asadm он должен отправлять файлы cookie автоматически (если вы выполняете перекрестный запрос, обязательно добавьте .withCredentials() ), но проблема, с которой я столкнулся, заключается в том, что он не работает на стороне сервера . Я продолжаю получать Error: Failed to serialize user into session когда сервер отправляет запрос на вход. Однако в браузере или с помощью curl запрос на вход работает нормально.

Не стесняйтесь отправлять PR с аксиомами или выборкой и т. Д.

@jaredpalmer Я еще не понял, как решить проблему, но я могу попробовать поработать над PR, как только он будет исправлен. : sweat_smile:

Кстати, я получаю ту же ошибку с fetch .

@jaredpalmer К сожалению, совсем нет. Это связано с универсальным рендерингом, паспорт работает нормально. Он также отлично работает для отправки запросов из браузера или curl , но когда сервер в этом шаблоне делает запрос на получение initialState , он терпит неудачу. Я предполагаю, что это связано с тем, что на стороне сервера не хранится пользовательский сеанс. Есть какой-либо способ сделать это?

Я думаю, что самый простой способ обойти эту проблему - вернуть токен и сохранить его в состоянии, а затем аутентифицировать запросы с помощью токена. Было бы неплохо, если бы клиент / сервер автоматически разделял правильный пользовательский сеанс: smile:

Это может быть связано с проблемой: http://stackoverflow.com/a/12735003/702288

можно ссылку на пример репо? Вы тоже пользуетесь экспресс-сессией?

@jaredpalmer К сожалению, я не могу поделиться кодом, но добавить passport к существующему шаблону несложно: http://passportjs.org/docs

Да, я использую express-session . Я пробовал использовать superagent.agent() , но это не помогло.

@jaredpalmer Я только что клонировал свежий экземпляр вашего шаблона и добавил express-session . Установка req.session приводит к сбою (я делал в src/server/api/posts.js ). Вы можете проверить это в моем форке omnidan / react-production-starter ( соответствующий коммит ).

Хорошо, неважно, моя проблема, похоже, не связана с этим: blush:

Я только что обнаружил, что он не может сериализовать пользователя, потому что данные были отправлены через json с сервера, но urlencoded из браузера / curl. добавление app.use(bodyParser.json()) на мой сервер устранило проблему для меня.

У меня все еще есть проблема, что сеанс работает некорректно. Я изменил один запрос на (в целях тестирования):

callAPI: () => http.post('http://localhost:3003/login', {
      email: '[email protected]',
      password: 'test'
    }).then(data => {
      console.log('login', data)
      return http.get('http://localhost:3003/user')
        .then(data => console.log('user data:', data))
    }),

Результатом этого является:

login { email: '[email protected]' }
user data: { error: 'Not authenticated, please log in.' }

Если я выполняю запрос /login а затем обращаюсь к /user в браузере, он работает нормально. Похоже, что сервер неправильно разделяет сеансы с клиентом.

Я решил это так:
Когда пользователь запрашивает страницу с экспресс-сервера. req содержит любые файлы cookie сеанса в своем заголовке. Я просто пересылаю req.headers.cookie вниз до HttpClient.js:

get: (cookies, path) => new Promise((resolve, reject) => {
    request
      .get(getUrl(path))
      .accept('application/json')
      .set("Cookie",cookies)
      .end((err, res) => {
        if (err) {
          if (err.status === 404) {
            resolve(null);
          } else {
            reject(err);
          }
        } else {
          resolve(res.body);
        }
      });
  }),

Имеет ли это смысл?

@asadm хорошая идея! Я собирался решить эту проблему, сохранив токен входа в хранилище redux, но это почти та же концепция с использованием файлов cookie. Попробую немного: grin:

@omnidan Я который предоставил

  getWithToken: (path, token) => new Promise((resolve, reject) => {
    request
      .get(getUrl(path))
      .set('X-User-Token', token)
      .accept('application/json')
      .end((err, res) => {
        if (err) {
          reject(err);
        } else {
          resolve(res.body);
        }
      });
  })
Была ли эта страница полезной?
0 / 5 - 0 рейтинги