С использованием apollo, cookie в заголовке ответа, но не установлен

Я разрабатываю функцию входа / регистрации пользователя в рамках более крупного проекта и работаю над 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

Localhost: 3000 и localhost: 8080 не являются одним и тем же источником, поэтому они не могут совместно использовать файлы cookie, используя учетные данные: same-origin.

Benjie 27.10.2018 16:33

Я получаю несколько ошибок политики CORS, когда пытаюсь использовать include, либо: «Значение заголовка 'Access-Control-Allow-Origin' в ответе не должно быть подстановочным знаком '*', если режим учетных данных запроса - 'include' . " ИЛИ «Тип содержимого поля заголовка запроса не разрешен Access-Control-Allow-Headers в предпечатном ответе».

Michael Ross 27.10.2018 17:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
10
2
5 074
4

Ответы 4

Проблема, похоже, связана с конфигурацией 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'.

Michael Ross 02.11.2018 22:55

Мне удалось решить эту проблему, напрямую передав настройки 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'
});

Другие вопросы по теме