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


Да, если вы посмотрите на игровую площадку 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');
});
Легенда. Понятия не имею, почему по умолчанию установлено опускание. Мне не пришло в голову это проверить. Спасибо !
У вас это сработало? У нас та же проблема.