Сеанс Apollo 2.0.0 Graphql cookie

Может ли кто-нибудь помочь мне в этом, моя установка была следующей до Apollo 2.0, у меня был server.js, в котором я использовал express и graphql-server-express У меня был сеанс cookie только для http, когда пользователь входит в систему, я устанавливаю токен jwt как файл cookie, и он устанавливается в браузере только как http. По последующему запросу я проверяю файл cookie, который браузер передает обратно. Все работало нормально, и я мог получить доступ токен из req.session.token в любом другом преобразователе и проверить токен jwt, сохраненный в сеансе cookie.

server.js

import express from 'express';
import { graphqlExpress, graphiqlExpress } from 'graphql-server-express';
import { ApolloEngine } from 'apollo-engine';
import bodyParser from 'body-parser';
import cors from 'cors';
import cookieSession from 'cookie-session';
import schema from './schema/';
​
const server = express();
​
server.use(
 cookieSession({
  name: 'session',
  keys: 'k1,k2',
  maxAge: 30 * 60 * 1000,
  domain: '.mydomain.com',
  path: '/',
 }),
);
​
const corsOptions = {
 origin: 'http://local.mydomain.com:3000',
 credentials: true,
 methods: ['GET', 'PUT', 'POST', 'OPTIONS'],
};
​
server.use(cors(corsOptions));
​
server.use(
 '/graphql',
 bodyParser.json(),
 graphqlExpress(req => ({
  schema,
  tracing: true,
  context: { req },
 })),
);
​
if (process.env.NODE_ENV !== 'production') {
 server.use('/graphiql',graphiqlExpress({endpointURL: '/graphql'}));
}
​
const engine = new ApolloEngine({
 apiKey: engineConfig.apiKey,
});
​
engine.listen(
 {
  port: 3000,
  graphqlPaths: ['/graphql'],
  expressApp: server,
 },
 () => {console.info('GraphiQL is now running');},
);

AuthenticateResolver.js

const authenticateResolver = {
 Query: {
  authenticate: async (root, args, context) => {
   const { req } = context;
​
   const auth = `Basic ${Buffer.from(`${args.username}:${args.password}`).toString('base64')}`;
​
   const axiosResponse = await axios.post("localhot:8080/login, 'true', 
    {
     headers: {
       Authorization: auth,
     },
    });
​
   if (axiosResponse.status === 200 && axiosResponse.data.token) {
    req.session.token = axiosResponse.data.token;
   }
   return {
     status: 200,
   };
 },

Но когда я обновился до Apollo 2.0, мой код server.js изменился, AuthenticateResolver остался прежним. Теперь я не могу получить доступ к req.session.token в любых последующих запросах, поскольку сеанс cookie не устанавливается. Когда я открываю инструменты разработчика в хроме, я не вижу, чтобы файл cookie был установлен при вызове аутентификации. Что я здесь делаю не так?

server.js # После обновления Apollo 2.0

import express from 'express';
import { ApolloServer, gql } from 'apollo-server-express';
import cors from 'cors';
import cookieSession from 'cookie-session';
import { mergedTypes, resolvers } from './schema/';
​
const server = express();
​
server.use(
 cookieSession({
  name: 'session',
  keys: 'k1,k2',
  maxAge: 30 * 60 * 1000,
  domain: '.mydomain.com',
  path: '/',
 }),
);
​
const corsOptions = {
 origin: 'http://local.mydomain.com:3000',
 credentials: true,
 methods: ['GET', 'PUT', 'POST', 'OPTIONS'],
};
​
server.use(cors(corsOptions));
​
server.listen({ port: 3000 }, () => { 
 console.info('Server ready');
 console.info('Try your health check at: .well-known/apollo/app-health');
});
​
const apollo = new ApolloServer({
 typeDefs: gql`
  ${mergedTypes}
 `,
 resolvers,
 engine: false,
 context: ({ req }) => ({ req }),
});
​
apollo.applyMiddleware({
 server
});

У вас это сработало? У нас та же проблема.

Tom Hubbard 21.09.2018 22:36

Вы нашли для этого решение?

Le Dinh Nhat Khanh 28.10.2018 08:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
11
2
7 690
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, если вы посмотрите на игровую площадку graphql, там есть опция настроек, если вы нажмете на нее, вы увидите несколько настроек, одна из которых "request.credentials": "omit" просто измените его на "request.credentials": "include" и сохраните настройки, и теперь он должен работать

См. Изображение

Мой код тоже выглядит следующим образом:

константное приложение = экспресс ();

app.use(
   cookieSession({
     name: 'session',
     keys: corsConfig.cookieSecret.split(','),
     maxAge: 60 * 60 * 1000,
     domain: corsConfig.cookieDomain,
     path: '/',
   }),
);


const corsOptions = {
   origin: corsConfig.corsWhitelist.split(','),
   credentials: true,
   methods: ['GET', 'PUT', 'POST', 'OPTIONS'],
};

app.use(cors(corsOptions));

const apollo = new ApolloServer({
   typeDefs: gql`
   ${mergedTypes}
   `,
   resolvers,
   engine: false,
   context: ({ req }) => ({ req }),
   tracing: true,
   debug: !process.env.PRODUCTION,
   introspection: !process.env.PRODUCTION,
});

apollo.applyMiddleware({
    app,
    path: '/',
    cors: corsOptions,
});

app.listen({ port: engineConfig.port }, () => {
   console.info('? - Server ready');
   console.info('Try your health check at: .well-known/apollo/app-health');
});

Легенда. Понятия не имею, почему по умолчанию установлено опускание. Мне не пришло в голову это проверить. Спасибо !

gk0r 22.12.2018 13:06

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