Я разрабатываю функцию входа / регистрации пользователя в рамках более крупного проекта и работаю над localhost (сервер apollo и реагирую на интерфейс apollo). Я использую экспресс-сессию для своих сессий.
При отправке моего логина я вижу, что в заголовке ответа есть set-cookie внутри, но он не установлен в Application-> Cookies.
Я пробовал разные браузеры, используя createHttpLink, apollo-boost и используя include & same-origin (используя same-origin).
Я пытался заставить это работать в течение 2 недель, и у меня закончились вещи, чтобы попробовать, это был мой последний вариант! Я знаю, что это будет что-то действительно тривиальное, но я просто не вижу этого.
Если я использую GraphqL Playground и изменяю настройки, чтобы включить учетные данные, я вижу, что там устанавливается файл cookie.
Сервер работает на локальном хосте: 8080 / graphql Клиент работает на localhost: 3000
Клиент:
const client = new ApolloClient({
link: new HttpLink({
uri: 'http://localhost:8080/graphql',
credentials: 'same-origin',
}),
cache: new InMemoryCache()
});
Корс:
app.use(
cors({
origin: 'http://localhost:3000',
credentials: true
})
);
Экспресс-сессия:
app.use(
session({
name: "sess",
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: false,
maxAge: 1000 * 60 * 60 * 24 * 7,
},
})
);
Ответный Cookie:
HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Type: application/json
Content-Length: 69
set-cookie: sess=s%3AAZXnGb5BVc1aAOwH6zBNiT8mB6Ebf75k.in%2BPU1OvxymDPdPIZBf8%2FQzrRmM0S04tXFzXDwYCnk8; Path=/; Expires=Sat, 03 Nov 2018 13:59:57 GMT; HttpOnly
Date: Sat, 27 Oct 2018 13:59:57 GMT
Connection: keep-alive
Я получаю несколько ошибок политики CORS, когда пытаюсь использовать include, либо: «Значение заголовка 'Access-Control-Allow-Origin' в ответе не должно быть подстановочным знаком '*', если режим учетных данных запроса - 'include' . " ИЛИ «Тип содержимого поля заголовка запроса не разрешен Access-Control-Allow-Headers в предпечатном ответе».
Проблема, похоже, связана с конфигурацией CORS. Сначала измените HttpLink
на использование credentials: 'include'
; затем попробуйте это промежуточное ПО CORS:
app.use(
cors({
origin: 'http://localhost:3000',
credentials: true,
allowedHeaders: ['Content-Type', 'Authorization'],
})
);
Если вы по-прежнему получаете сообщение об ошибке The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
, это означает, что промежуточное ПО CORS неправильно устанавливает Access-Control-Allow-Origin: http://localhost:3000
(ваш пример показывает, что он возвращает *
, но я не уверен, была ли это проблема копирования / вставки, поскольку документы модуля cors
предполагают, что это должно Работа.)
Спасибо за ответ, я все время получаю это: Access to fetch at 'http://localhost:8080/graphql' from origin 'http://localhost:3000' has been blocked by CORS policy: The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.
Мне удалось решить эту проблему, напрямую передав настройки CORS в applyMiddleware.
Пытался исправить с помощью экспресс. Но с Apollo GraphQL это не сработало.
const corsOptions = {
origin: "http://localhost:3000",
credentials: true
};
app.use(cors(corsOptions));
Итак, я попытался настроить cors внутри сервера GraphQL, и он сработал.
Для сервера Apollo
const corsOptions = {
origin: "http://localhost:3000",
credentials: true
};
const server = new ApolloServer({
typeDefs,
resolvers,
cors: corsOptions
});
server.listen().then(({ url }) => {
console.info(`? Server ready at ${url}`);
});
Для GraphQL Yoga
const options = {
cors: corsOptions
};
server.start(options, () =>
console.info("Server is running on http://localhost:4000")
);
Я была такая же проблема. Если вы все еще ищете ответ через 2 года, установите учетные данные в клиенте, чтобы «включить», например:
const client = new ApolloClient({
uri: 'http://localhost:4000/graphql',
cache: new InMemoryCache(),
credentials: 'include'
});
Localhost: 3000 и localhost: 8080 не являются одним и тем же источником, поэтому они не могут совместно использовать файлы cookie, используя учетные данные: same-origin.