Apollo-server 2 验证中间件

Posted

技术标签:

【中文标题】Apollo-server 2 验证中间件【英文标题】:Apollo-server 2 validation middleware 【发布时间】:2019-05-19 04:37:10 【问题描述】:

我想向 apollo 服务器添加一个验证层。 它应该在每个 graphql 查询/突变之后但在解析器函数之前运行。验证层需要知道被调用的 graphql 查询/突变和传递的参数。如果它无效,它会抛出一个错误并阻止解析器函数运行。

如果不手动将其放入每个解析器函数中,我不清楚将其注入何处。

【问题讨论】:

【参考方案1】:

graphql-tools 实际上包含一个addSchemaLevelResolveFunction 实用程序,它允许您为每个QueryMutationSubscription 字段包装解析器以模拟“根级解析器”:

const makeExecutableSchema, addSchemaLevelResolveFunction = require('graphql-tools')

const schema = makeExecutableSchema( resolvers, typeDefs )
const rootLevelResolver = (root, args, context, info) => 
  // Your validation logic here. Throwing an error will prevent the wrapped resolver from executing.
  // Note: whatever you return here will be passed as the parent value to the wrapped resolver

addSchemaLevelResolveFunction(schema, rootLevelResolver)

这是一种将一些逻辑应用于所有根级字段的简单方法,但如果您只想将此逻辑应用于 一些 字段,则会有点麻烦。如果是这种情况,现在您必须维护一个列入白名单或列入黑名单的字段列表,与您的架构分开。如果您团队中的其他人正在添加新字段并且不了解此机制,这可能会很麻烦。如果您想将相同的逻辑应用于根级别之外的字段,它也不是很有帮助。

更好的方法是使用自定义架构指令as outlined in the docs。这允许您指示将逻辑应用于哪些字段:

directive @customValidation on FIELD_DEFINITION

type Query 
  someField: String @customValidation
  someOtherField: String

【讨论】:

【参考方案2】:

您可以在context 中添加您的验证方法,您还可以在其中获取请求参数、查询、标头等

您还可以考虑实现可应用于架构级别的自定义指令。

参考https://www.apollographql.com/docs/apollo-server/features/authentication.html

【讨论】:

以上是关于Apollo-server 2 验证中间件的主要内容,如果未能解决你的问题,请参考以下文章

在客户端处理 apollo-server 错误

如何从 ASP.NET Core 2.0 中的自定义中间件请求身份验证

ASP.NET Core 2.0 身份验证中间件

中间件身份验证不适用于 Web Laravel 5.2

Laravel 5.2:如何在中间件中使用身份验证

Lumen 中的中间件身份验证 [未找到“身份验证”类]