Quelqu'un peut-il m'aider à ce sujet, ma configuration était la suivante avant Apollo 2.0, j'avais un server.js dans lequel j'utilisais express et graphql-server-express, j'avais une session de cookie http uniquement, lorsqu'un utilisateur se connectait, je définissais le jeton jwt en tant que cookie et il est défini dans le navigateur en tant que http uniquement. Sur demande ultérieure, je valide le cookie que le navigateur renvoie. Tout fonctionnait bien et je pouvais accéder au jeton depuis req.session.token dans n'importe quel autre résolveur et valider le jeton jwt enregistré dans la session de 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.log('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,
};
},
Mais lorsque j'ai mis à niveau vers Apollo 2.0, mon code server.js a changé, authenticateResolver était tel quel. Je ne suis plus en mesure d'accéder à req.session.token dans les demandes suivantes, car la session de cookies n'est pas définie. Lorsque j'ouvre les outils de développement dans chrome je ne peux pas voir le cookie défini lors de l'appel de l'authentification. Que fais-je de mal ici?
server.js # Après la mise à niveau d'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.log('Server ready');
console.log('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
});
Oui, si vous regardez le terrain de jeu graphql, il y a une option de paramètres si vous cliquez dessus, vous pouvez observer quelques paramètres, l'un d'eux étant "request.credentials": "omit" il suffit de le changer en "request.credentials": "include "et enregistrer les paramètres et cela devrait maintenant fonctionner
Mon code ressemble également à ceci,
const app = express ();
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.log('???? - Server ready');
console.log('Try your health check at: .well-known/apollo/app-health');
});