Apollo 2.0.0 Graphql cookie 会话

2023-11-22

有人可以帮助我吗,在 Apollo 2.0 之前我的设置如下,我有一个 server.js,其中使用了express和graphql-server-express 我有一个仅 http 的 cookie 会话,当用户登录时,我将 jwt 令牌设置为 cookie,并在浏览器中将其设置为仅 http。 在随后的请求中,我验证浏览器传回的 cookie。一切正常,我可以访问 来自任何其他解析器中的 req.session.token 的令牌并验证 cookie 会话中保存的 jwt 令牌。

服务器.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');},
);

验证解析器.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 会话未设置。 当我在 Chrome 中打开开发人员工具时,我看不到调用身份验证时设置的 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.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"并保存设置,它现在应该可以工作了。

Refer to image

我的代码也如下所示:

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('									
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apollo 2.0.0 Graphql cookie 会话 的相关文章

随机推荐

  • 如何使用单个数组实现三个堆栈

    我在一个面试网站上遇到了这个问题 该问题要求在单个数组中有效地实现三个堆栈 以便在整个数组空间中没有剩余空间之前堆栈不会溢出 对于在数组中实现 2 个堆栈 这是非常明显的 第一个堆栈从左到右增长 第二个堆栈从右到左增长 当 stackTop
  • Android Firebase - 无法使用 getUid() 获取用户 ID - 错误:空对象引用

    我正在使用 Firebase 并且注册 登录活动工作正常 但我也希望每个用户更新用户名 看来我无法运行 firebaseRef getAuth getUid 我在应用程序模拟器中收到错误 不幸的是 应用程序已停止 这看起来像是我在 andr
  • jQuery Ajax 和重定向来自服务器的响应

    我有一种情况 我发送 jquery ajax post 请求 但在我的 web 应用程序中 该特定 ajax 请求的处理程序 处理 post 参数后 将调用另一个控制器中的操作 不确定这是否称为重定向 该操作基本上呈现整个网站页面 如页面刷
  • 将 struct.unpack 从 python 2.7 移植到 3

    以下代码在 python 2 7 中运行良好 def GetMaxNoise data max noise for byte in data noise ComputeNoise struct unpack B byte 0 if max
  • Android Webview中视频只播放一次

    我成功地在 Android 中的 Webview 中播放来自 HTML5 内容的流式 Youtube 视频 但现在的问题是视频仅在第一次播放 在那之后VideoView仅转到视频文件的末尾 我尝试按照建议清除缓存here但没有运气 这个问题
  • DownloadFile 与 DownloadFileAsync

    我正在使用 WebClient DownloadFile 从 Web 服务器一次下载一个文件 但是 我想知道 线程被阻止 开发人员是否意味着应用程序不会响应 我尝试使用 WebClient DownloadFileAsync 但它不像 Do
  • 获取临时对象的地址

    5 3 1 一元运算符 第 3 节 一元 运算符的结果是指向其操作数的指针 操作数应为左值或合格的 ID 在这种情况下 应该 到底意味着什么 这是否意味着获取临时地址是错误的 我只是想知道 因为 g 只给我一个警告 而 comeau 拒绝编
  • 拉拉维尔。在具有关系的模型中使用scope()

    我有两个相关模型 Category and Post The Post模型有一个published范围 方法scopePublished 当我尝试获取该范围内的所有类别时 categories Category with posts gt
  • PDF 中需要 Arial 字体(BIRT pdf 渲染器,Linux)

    我使用 BIRT IDE 创建了一个 rptdesign 文件 该文件内容采用 Arial 字体 当我在 Windows 中将报告导出为 PDF 时 它工作正常 我使用默认的viewerServlet 来创建报告 但是当我将报告移动到Lin
  • 在 JavaScript 中实现单例的最简单/最干净的方法

    实现最简单 最干净的方法是什么单例模式在 JavaScript 中 我认为最简单的方法是声明一个简单的对象文字 var myInstance method1 function method2 function 如果您希望单例实例上有私有成员
  • 如何在 Python 中将列表分割成连续的非零整数组

    似乎无法在网上找到这方面的线索 并且我自己也无法弄清楚 所以 我将如何对列表进行切片 以便返回连续非零整数切片的列表 IE data 3 7 4 0 1 3 7 我想生产 slices 3 7 4 1 3 7 我尝试过各种迭代列表的方法 一
  • 如何向 UICollectionView 添加背景图像,该图像将滚动和缩放单元格

    我正在使用构建马赛克视图UICollectionView 我已经子类化了UICollectionViewFlowLayout布局一个可以滚动的固定网格水平和垂直 我还附上了一个UIPinchGestureRecognizer这样集合就可以缩
  • 带有 pandas 的多个堆叠条形图

    我正在尝试用 pandas 制作多个堆叠条形图 但遇到了问题 这是示例代码 import pandas as pd df pd DataFrame a 10 20 b 15 25 c 35 40 d 45 50 index john bob
  • IE8/9 中的 CORS 与 jQuery 和 XDomainRequest

    UPDATE 我强烈建议不要在 XDomainRequest 上投入任何时间 因为它是一个非常糟糕的实现 有很多限制 它基本上只适用于对非 ssl 服务器的 GET 请求 所以你不妨使用 jsonp 或其他什么 我正在使用 CORS 调用跨
  • 使 TinyMCE 图像选择对话框指向 Plone 上的默认文件夹

    克隆人 4 1 使 TinyMCE 图像选择器对话框指向站点默认文件夹 image bank 而不是当前文件夹的最简单方法是什么 这个 文件夹显示为相册将为 Plone 轻松提供基本的图像库支持 我希望能够实现这个功能 所有 Plone 开
  • SSIS - 再次出现内存不足错误

    我有 cca 25 个数据库 需要将其合并为 1 个数据库 首先 我尝试构建一个 ssis 包 它将每个表中的所有数据复制到一个地方 但随后出现错误 信息 缓冲区管理器的内存分配调用失败 10485760 字节 但无法交换任何缓冲区来缓解
  • 可能的 Java 编译器错误!程序无法使用某些编译器编译

    首先 介绍一点背景知识 如果不感兴趣 可以跳过一点 我很生气又很困惑 这应该是一个非常简单的用例 而且确实是我的代码has使用 Eclipse JDT 编译器编译得很好 所以到目前为止我一直在配置 Maven 以确保做到这一点 尽管它不能使
  • Python 装饰器对递归函数进行计时

    我有一个简单的装饰器来跟踪函数调用的运行时 def timed f def caller args start time time res f args end time time return res end start return c
  • 在VS 2015社区版中将.Net框架从4.5.2更改为4.5时出现编译错误

    在 VS 2015 社区版中将我的 Net 框架从 4 5 2 更改为 4 5 后 我收到以下错误 有谁知道问题是什么以及如何解决这个问题 看起来编译版本不同 但我已经将 web config 修改为 4 5 应用程序中的服务器错误 编译错
  • Apollo 2.0.0 Graphql cookie 会话

    有人可以帮助我吗 在 Apollo 2 0 之前我的设置如下 我有一个 server js 其中使用了express和graphql server express 我有一个仅 http 的 cookie 会话 当用户登录时 我将 jwt 令
Powered by Hwhale