gpt4 book ai didi

graphql - 如何限制查询自省(introspection)

转载 作者:行者123 更新时间:2023-12-02 21:10:59 26 4
gpt4 key购买 nike

我有一个由 apollo-server 提供支持的 node.js 项目。我使用自定义@admin对查询、突变和对象字段进行权限检查的指令。对于查询和突变,该指令会引发错误,对于字段,它返回 null 而不是实际值。

现在,我想将 graphiql ui 添加到我的项目中,以便其他开发人员可以探索我的 graphql 架构。但是,我希望他们像匿名用户一样看到架构,即他们不应该知道 @admin 的存在。字段和@admin查询和所有突变(甚至非管理突变)。即使那些拥有执行这些操作凭据的人(即以管理员身份登录)也不应该看到架构的这些部分。

据我了解,graphiql 发送特殊的内省(introspection)查询,其中包含 __schema__type显示架构及其文档的字段。

是否可以以某种方式修改我的架构,该架构是使用 makeExecutableSchema 构建的来自graphql-tools实现我的目标?

最佳答案

这是一种方法

您可以为主端点使用扩展架构,并为 graphiql 端点使用相同的架构而不使用扩展。

让我们以此架构定义为例:

// schemaDef
type Query {
anonQuery: QueryResult
adminQuery: AdminQueryResult @admin
}

以及可执行架构:

const schema = makeExecutableSchema({
typeDefs: [schemaDef /* ... additional schema files */],
resolvers: merge(schemaResolvers/* ... additional resolvers */)
})

现在,让我们借助 extend 关键字来拆分架构定义。 Read here about Extending Types and the extend keyword .

// anonymous part of the original schema definition:
type Query {
anonQuery: QueryResult
}

// admin extensions definitions:
extend type Query {
adminQuery: AdminQueryResult @admin
}

为了避免出现有关架构中未定义的解析器的警告,您可能需要将与管理相关的解析器拆分到另一个文件或另一个解析器映射。

现在您将拥有 2 个可执行模式:

const mainSchema = makeExecutableSchema({
typeDefs: [schemaDef /* ... additional schema files */],
resolvers: merge(schemaResolvers/* ... additional resolvers */)
})

const extendedSchema = makeExecutableSchema({
typeDefs: [schemaDef, adminSchemaExtensions /* ... additional schema files */],
resolvers: merge(schemaResolvers, adminSchemaResolvers /* ... additional resolvers */)
})

您的主要端点应使用扩展架构。

router.use('/graphql', /* some middlewares */, graphqlExpress({schema: extendedSchema}))

由于 GraphQL 端点需要一个 GraphQL 端点,因此您必须专门为第二个架构创建另一个端点。也许是这样的:

router.use('/graphql-anon', /* some middlewares */, graphqlExpress({schema: mainSchema}))

router.use('/graphiql', /* some middlewares */, graphiqlExpress({endpointURL: '/graphql-anon'}))

就是这样!

现在,您的大部分代码都是共享的,并且只有部分架构可以使用 GraphiQL 接口(interface)访问。

将管理定义放在单独的文件中可能会更方便或更不方便,具体取决于您的项目、代码和首选项。

关于graphql - 如何限制查询自省(introspection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49697493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com