GraphQL 是一个强大的查询语言,但是对于前端开发人员来说,如何处理验证和授权错误可能会有些困难。Apollo Server 提供了一些工具和技术来帮助您处理这些错误,使您的 GraphQL API 更加安全和可靠。
验证和授权的区别
在 GraphQL 中,验证和授权是两个不同的概念。验证是确保用户提供的输入符合预期的格式和类型,而授权则是确保用户有权访问请求的数据或操作。
例如,假设您有一个查询,返回有关用户的敏感信息。验证将确保用户提供了正确的参数和类型,而授权将确保只有经过身份验证的用户才能访问该查询。
使用 Schema Directives 进行验证和授权
Apollo Server 提供了一种称为 Schema Directives 的功能,可以帮助您轻松地处理验证和授权。Schema Directives 是一种用于修改 GraphQL Schema 行为的工具,它们允许您在运行时处理验证和授权。
例如,假设您有一个查询,只允许经过身份验证的用户访问。您可以使用 Schema Directives 来处理此要求,如下所示:
-- -------------------- ---- ------- --------- --------------- ---- - ----- -- ------ - ---------------- ---- ---- - ----- ---- - ---- ----- - ----- ---- --------------- ----- - ---- ---- - --- --- ----- ------- ------ ------- --------- ------- ----- ----- -
在上面的示例中,我们使用了一个名为 @auth 的 Schema Directive。它需要一个名为 requires 的参数,该参数指定用户需要的角色。我们还定义了一个枚举类型 Role,它包含 ADMIN 和 USER 两个值。
在 User 类型中,我们使用了 @auth Directive,它要求用户必须具有 USER 角色才能访问 user 查询。如果用户没有正确的角色,将返回错误。
处理验证错误
处理验证错误可能会比处理授权错误更为简单。在 Apollo Server 中,您可以使用 GraphQL 的类型系统来处理验证错误。
例如,假设您有一个查询,需要一个整数类型的参数。如果用户提供了一个字符串类型的参数,您可以使用 GraphQL 的类型系统来捕获错误,如下所示:
type Query { user(id: Int!): User }
在上面的示例中,我们将 id 参数的类型定义为 Int。如果用户提供了一个字符串类型的值,GraphQL 将自动返回错误。
处理授权错误
处理授权错误可能会比处理验证错误更为复杂。在 Apollo Server 中,您可以使用 Schema Directives 和错误处理程序来处理授权错误。
例如,假设您有一个查询,只允许经过身份验证的用户访问。您可以使用 @auth Directive 和错误处理程序来处理此要求,如下所示:
-- -------------------- ---- ------- ----- - ------------- ------------------- - - ------------------------- ----- -------- - - --------- --------------- ---- - ----- -- ------ - ---------------- ---- ---- - ----- ---- - ---- ----- - ----- ---- --------------- ----- - ---- ---- - --- --- ----- ------- ------ ------- --------- ------- ----- ----- - -- ----- --------- - - ------ - ----- -------- ----- -------- -- - -- --------------- - ----- --- ------------------------ ---- -- ------ ----- - -- ---- -- -- -- ----- ------ - --- -------------- --------- ---------- -------- -- --- -- -- - ----- ----- - ------------------------- -- --- ----- ---- - ------------------------ ------ - ---- -- -- ------------ ------- -- - -- -------------------- ---------- -------------------- - ------ --- ------------------------ ---- -- ------ ----- - ------ ------ -- --- ----------------------- --- -- -- - ------------------- ----- -- --------- ---
在上面的示例中,我们使用 @auth Directive 指定了用户需要的角色。在 Resolver 中,我们检查 context 中是否存在 user 对象。如果不存在,我们将抛出一个 AuthenticationError。
在 Apollo Server 中,您可以使用 formatError 函数自定义错误消息。在上面的示例中,我们检查错误是否是 AuthenticationError,并返回自定义错误消息。
结论
Apollo Server 提供了一些工具和技术来帮助您处理 GraphQL 的验证和授权错误。使用 Schema Directives 和错误处理程序,您可以轻松地处理这些错误,使您的 GraphQL API 更加安全和可靠。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67590e8d62956301acd52f14