Apollo 2.0.0 GraphQL Cookie会话 [英] Apollo 2.0.0 Graphql cookie session

查看:8
本文介绍了Apollo 2.0.0 GraphQL Cookie会话的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人能帮我吗?在Apollo 2.0之前,我的设置如下所示,我有一个server.js,其中我使用Express和GraphQL-SERVER-EXPRESS 我有一个仅限http的cookie会话,当用户登录时,我将JWT令牌设置为cookie,并且在浏览器中将其设置为仅限http。 在后续请求中,我验证浏览器传回的Cookie。它工作得很好,我可以访问 来自任何其他解析程序中的req.ession.Token的令牌,并验证保存在Cookie会话中的JWT令牌。

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');},
);

authateResolver.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代码发生了变化,authateResolver仍然是原来的样子。 我现在无法在任何后续请求中访问req.ession.Token,因为没有设置Cookie会话。 当我在Chrome中打开开发人员工具时,我看不到调用身份验证时设置的Cookie。 我在这里做错了什么?

升级Apollo 2.0后的server.js# ​

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
});

推荐答案

是,如果您查看GraphQL操场,则会有一个设置选项,如果您单击该选项,则可以观察到一些设置,其中之一是 "request.credentials": "omit"只需更改为 "request.credentials": "include"并保存设置,现在应该可以工作了。

我的代码也如下所示:

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')
})

这篇关于Apollo 2.0.0 GraphQL Cookie会话的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆