Дорогие,
Мой https-клиент, созданный в React, не получает файлы cookie, созданные на сервере (приложение node.js, используя экспресс-сеанс), при вызове мутаций graphql на сервере.
Обе стороны https, сервер работает на порту 443 https: // локальный: 443, клиент на порту 3000 https: // локальный: 3000
Когда я запускаю конечную точку игровой площадки graphql (https: // локальный: 443 / graphql), инструмент graphql получает файлы cookie.
Но когда я вызываю мутации graphql от клиента, используя apollo, клиент получает данные, но не cookie ...
Поэтому я предполагаю, что проблема связана с портами, которые различаются между сервером и клиентом, но я перепробовал все конфигурации для параметров файлов cookie «sameSite» и «secure». Какой бы ни была комбинация этих двух логических значений, клиент никогда не получает cookie.
Есть ли еще какой-либо параметр, который нужно установить?
Вот код экспресс-сеанса узла (сеанс хранится в хранилище Redis)
спасибо.
app.use(cors({ origin: 'https://localhost:3000', credentials: true }));
app.use(session({
store,
name: SESSION_NAME,
secret: SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: parseInt(SESSION_LIFETIME),
sameSite: !IN_DEV,
secure: !IN_DEV
},
}));
[РЕДАКТИРОВАТЬ - ПРОБЛЕМА УСТАНОВЛЕНА ПОСЛЕ ПОМОЩИ Даниэля Риардена]
вот код на стороне сервера и на стороне клиента, чтобы исправить все проблемы.
Сторона сервера:
// generation sessions
app.use(session({
store,
name: SESSION_NAME,
secret: SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: parseInt(SESSION_LIFETIME),
httpOnly: true,
sameSite: true,
secure: !IN_DEV,
},
}));
app.use(cors({ origin: 'https://localhost:3000', credentials: true }));
// should be added to avoid CORS issue after executing the Grahql queries
res.setHeader("Access-Control-Allow-Origin", "https://localhost:3000");
const apolloServer = new ApolloServer({
typeDefs,
resolvers,
// // permet de tester grqphql.
// // settings permet de gerer en dev les cookies
playground: IN_DEV ? {
settings: { 'request.credentials': 'include' }
} : false,
context: ({ req, res }) => ({ req, res })
});
apolloServer.applyMiddleware({ app });
сторона клиента
import { ApolloClient } from 'apollo-client';
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
const link = createHttpLink({
uri: "https://localhost/graphql",
credentials: 'include'
});
export const apolloClient = new ApolloClient({
link,
cache: new InMemoryCache({ addTypename: false })
});
Вы должны убедиться, что ваш клиент правильно настроен для отправки и получения файлов cookie. В частности, ссылка http должна быть настроена с использованием правильной политики учетных данных (например, include), как указано в указанном потоке. Если тот же запрос работает с Playground, это указывает на проблему конфигурации клиента.
Вы можете отредактировать свой вопрос, включив в него конфигурацию клиента, если вы считаете, что это правильно, но вы по-прежнему сталкиваетесь с той же проблемой.
ОК сделает это, как только получит доступ к коду. спасибо
Уважаемые, это устранило мою проблему, спасибо большое. Однако мне пришлось также справиться с проблемой cors, которая произошла после, на стороне сервера. Обновили мой пост для тех, кто столкнется с такой же проблемой.





не думайте, что это дублируется. Моя проблема в том, что клиент не получает cookie от сервера, а не в том, что он его не отправляет. Как я уже упоминал, игровая площадка получает это хорошо, но не реагирующие приложения, работающие на другом порту, тогда как журналы показывают, что сеанс хорошо настроен при получении запроса от клиента. Но в ответ cookie не отправляется ...