GraphQL 是一种用于 API 开发的查询语言和运行时环境。尽管它在发展和使用方面远不及 REST,但它的规范性和可扩展性仍然使得它成为了很多 Web 开发人员的选择。
在 GraphQL 中,控制对 API 的访问是一个常见的安全需求。本文将介绍如何在 GraphQL 中设置权限和身份验证,以确保只有经过身份验证的用户可以访问您的 API。我们还将介绍实现身份验证和授权的几个常见技术。
身份验证和授权
身份验证是指确认用户的身份。在 Web 应用程序中,大多数身份验证过程都涉及验证用户提供的用户名和密码。授权是指确定用户是否有权访问某个资源。在 Web 应用程序中,可通过访问令牌或会话 ID 等方式进行授权。
对于 GraphQL API,需要的是确保只有经过身份验证的用户才能访问某些查询或修改操作。这可以通过以下两种方式实现:
- 基于用户身份验证令牌进行身份验证并使用它来执行有限的查询和修改操作。
- 基于用户的角色和权限对操作进行授权。
设置身份验证令牌
在 GraphQL 中,可通过将身份验证令牌添加到 HTTP 头文件中的 "Authorization" 字段中,来实现基于令牌的身份验证。令牌的值可以是访问令牌、JWT 令牌或其他令牌。
以下是一个示例 Authorization HTTP 头文件,其中令牌值为 "Bearer e72e16c7e42f292c6912e7710c838347ae178b4a":
Authorization: Bearer e72e16c7e42f292c6912e7710c838347ae178b4a
使用身份验证令牌进行身份验证时,GraphQL 可以使用 GraphQL 中间件来检查令牌的有效性,并在请求中注入用户数据。
以下是一个 Node.js 中间件示例,该示例在请求中注入了经过身份验证的用户数据:
-- -------------------- ---- ------- ----- --- - ------------------------ -------- -------------- - --- - -- ------- - ------ ----------------- ------------------------ - ------ ----- - ----- ----- - ------ ----- - - -------------- - ----- ----- ---- ----- -- - ----- ----- - -------------------------- ----- ---- - ----- --------------- -------- - ----- ------- --
当请求经过这个中间件时,它将从 Authorization 标头中提取令牌,验证它,并将用户数据添加到请求中。我们可以使用该数据来解决 GraphQL 查询中的身份验证和授权问题。
实现基于角色的授权
基于角色的授权是指为用户分配角色,然后根据角色来授权其对资源的访问权限。角色可以是具有特定权限的用户的集合。在 GraphQL API 中实现角色授权是一种常见的方式,可确保用户只能访问他们有权访问的数据。
以下是一个示例 GraphQL 查询,该查询只允许带有 "editor" 角色的用户访问:
-- -------------------- ---- ------- ----- - -------- - -- ----- ------- - -------- - -- ------- - -
要实现此查询,我们需要在请求中检查用户的角色,并根据需要禁用查询。以下是一个示例中间件,该示例从请求中提取角色并阻止未授权访问:
-- -------------------- ---- ------- -------------- - -------------- -- ----- ---- ----- -- - ----- ---- - -------- - ------------- - ----- -- ------ -- ----------------------------- - ------ ---------------------- -------- --------------- --- - ------- --
该示例中间件接受一组允许的角色,并检查用户是否具有其中任何一种角色。如果用户未经身份验证或不具有所需的角色,则显示 "Unauthorized" 错误。
以下是使用中间件的示例 GraphQL 查询,该查询只允许具有 "editor" 角色的用户执行:
-- -------------------- ---- ------- ----- - -------- - -- ----- ------- - -------- - -- ------- - -
-- -------------------- ---- ------- ----- -------------- - ------------------------------ ----- -------------- - ------------------------------ ------------------------ ------------------------------------ ----- ------ - ---------------------- --------- ---------- --- -------- ----------- ------------- ------- --- --
在本例中,我们使用了两个中间件。auth 中间件用于向请求注入经过身份验证的用户数据,而 role 中间件用于验证用户是否具有所需的角色。
结论
在 GraphQL 中设置身份验证和授权是确保只有经过身份验证的用户才能访问您的 API 的一种有效方式。本文介绍了如何使用身份验证令牌和基于角色的授权来控制操作。
尽管 GraphQL 中没有内置身份验证机制,但可以使用中间件和其他库来实现身份验证。我们希望本文能够帮助您更好地了解如何保护您的 GraphQL API,并为您的后续工作提供一些有用的指导。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676d312c82fcee791c659a3a