如何从github graphql api创建远程可执行模式?

时间:2019-01-20 13:23:29

标签: oauth graphql apollo

在这种情况下,我正在尝试使用应用程序的本地模式 stitch GitHub graphql模式。该应用程序使用GitHub oAuth将用户连接到他们的GitHub数据。

大多数关于模式缝合的文章都使用 introspection 查询来获取远程服务器的模式。不幸的是,GitHub graphql api已通过访问令牌进行身份验证。我最初的意图是使用用户的oAuth访问令牌执行自省,但是随后我遇到了catch 22,其中自省需要在启动时进行,即在我拥有任何经过身份验证的用户之前。

所以基本问题是:如何从github graphql api创建远程可执行模式?

1 个答案:

答案 0 :(得分:1)

对该主题的进一步阅读显示,更好的模式是静态下载远程服务器的模式,然后从中创建一个远程可执行文件。

首先,您需要安装apollo cli:

$ npm install -g apollo

然后使用它下载GitHub模式:

$ apollo schema:download --header "Authorization: Bearer token"
  --endpoint=https://api.github.com/graphql github.json

其中token是一个无引号的字符串,其中包含对GitHub的访问令牌(我刚刚使用了自己帐户中的oAuth令牌)。截至撰写本文时,此json粘贴时长度为47112行。

您可以将此文件放在可以从其导入的应用程序中的任何位置。例如,在与从中创建架构的代码所在的目录相同,

代码导入

import { HttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { makeRemoteExecutableSchema } from 'apollo-server';
import { printSchema, buildClientSchema } from 'graphql/utilities';
import fetch from 'node-fetch';

导入实际模式

请注意,您可以通过对象分解直接访问json文件的一部分

import { __schema } from './github.json';

构建客户端架构和typeDefs

相信我,您需要这两个。是的,即使它显示 buildClient (您的服务器最终将成为GitHub服务器的客户端),您仍将在服务器上使用它。

const schema = buildClientSchema({ __schema });
const typeDefs = printSchema(schema);

设置链接

这将用于实际查询。在此示例中,我将用户和他/她的accessToken放在链接 context 中,该链接将来自其他地方。

const http = new HttpLink({ uri: 'https://api.github.com/graphql', fetch });
const link = setContext((request, previousContext) => {
  const { user } = previousContext;
  const { accessToken } = user;
  return { headers: { Authorization: `Bearer ${accessToken}` } };
}).concat(http);

最后,创建远程可执行模式

const ghSchema = makeRemoteExecutableSchema({
  schema,
  typeDefs,
  link,
});

export default ghSchema;

ghSchema将是 GraphQLSchema 的实例,您现在可以直接使用它,也可以使用mergeSchemas

缝合到其他模式

h / t到bessey换来他的comment on an Apollo feature request,这终于使我兴奋了。

相关问题