Извините, если это вопрос новичков. Что происходит, когда для вызова API требуется сеанс пользователя. Я предполагаю, что эти файлы cookie сеанса не будут перенаправлены в конечную точку API, когда рендеринг происходит на стороне сервера?
Любая идея о том, как мне пересылать файлы cookie пользователя в конечную точку API. Думаю, это будет где-то внутри HttpClient.js?
Спасибо
@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);
}
});
})
Самый полезный комментарий
@omnidan Я который предоставил