如何在 GraphQL 中使用 JWT 实现认证和授权

GraphQL 是一种新型的 API 技术,旨在改善传统 RESTful API 的缺陷。其中,认证和授权是构建安全和可靠 API 的必要组成部分。JWT(JSON Web Token)是一种流行的认证和授权机制,它具有可扩展性和灵活性。在本文中,我们将讨论如何在 GraphQL 中使用 JWT 实现认证和授权。

JWT 简介

JWT 是在网络上安全地传输信息(尤其是在身份验证方面)的一种简洁的、URL 安全的、具有自包含性的数据格式。JWT 由三个部分组成,分别为头部、载荷和签名。

头部包含了 JWT 使用的加密算法和类型信息:

-
  ------ --------
  ------ -----
-

载荷包含了 JWT 所要存储的信息,如用户的 ID、用户名等:

-
  ------ -------------
  ------- ----- -----
  ------ ----------
-

签名部分使用头部中定义的加密算法和密钥对头部和载荷进行加密,确保信息的完整性和安全性。

-----------
  ----------------------- - --- -
  -------------------------
  -------

在 GraphQL 中添加 JWT 认证和授权

要在 GraphQL 中实现 JWT 认证和授权,我们需要使用一个流行的 GraphQL 库,例如 apollo-server-express, 它基于 Express。 在代码中安装 jsonwebtoken 库 以便生成和验证 JWT。我们将编写一个 GraphQL 解析器,该解析器将从 HTTP headers 中提取 JWT 并验证其身份。

步骤一:安装所需的库

我们需要在代码中安装 jsonwebtoken 库以生成和验证 JWT,apollo-server-express 库将用于设置 GraphQL 服务器和路由处理程序,express 库将用于添加中间件和路由处理程序。

--- ------- --------------------- ------- ------------

步骤二:创建 JWT 设置配置项

我们需要为生成 JWT 设置一些必要的配置项。以下是一个示例的配置项,它将包含加密和解密 JWT 所使用的密钥、算法和到期时间。

----- -------------- - ----------------
----- ------------- - --------
----- -------------- - -----

----- ----------- - -
  ------- ---------------
  ---------- --------------
  ---------- ---------------
--

步骤三:生成 JWT

我们将创建一个函数,该函数将使用 jwtSettings 对象中的密钥、算法和到期时间信息生成 JWT 并返回其字符串表示形式。下面是一个示例 JWT 生成函数:

----- --- - ------------------------

-------- -------------------- -
  ------ ----------------- ------------------- -
    ---------- ----------------------
    ---------- ----------------------
  ---
-

步骤四:验证 JWT

我们将创建一个中间件函数,该函数将使用 JWT 中的密钥、算法和在配置项中设置的到期时间信息将 JWT 进行验证。 如果 JWT 验证成功则将继续执行相应处理程序,否则,将返回错误代码。

-------- ---------------- ---- ----- -
  -- ------ ---
  ----- ---------- - --------------------------
  -- ------------- -
    ----------------------------------- ------- ------------- ---------
    -------
  -
  ----- ----- - ------------------ ------
  -- -------- -
    ----------------------------------- ------- --------
    -------
  -

  --- -
    -- -- ---
    ----- ------------ - ----------------- ------------------- -
      ----------- ------------------------
    ---
    --------- - -------------
    -------
  - ----- ----- -
    ----------------------------------- ------- --------
  -
-

步骤五:设置 GraphQL 服务器

我们将创建一个 GraphQL 服务,该服务将包含使用上述中间件函数的路由。我们将进行以下操作:

  • 在路由中定义中间件函数的处理程序
  • 将路由添加到 express 应用程序中
  • 使用 apollo-server-express 库设置 GraphQL 服务器
----- ------- - -------------------
----- - ------------- --- - - ---------------------------------

----- --- - ----------

-- -------
---------------------

-- --------
------------ ----- ---- -- -
  ----------------- -- -- ------- ---------
---

-- -- ------- ------
----- -------- - ----
  ---- ----- -
    ------ ------
  -
--

-- -- ------- --------
----- --------- - -
  ------ -
    ------ -------- ----- - ----- -- -- -
      ------ ------- ---------------
    --
  --
--

-- -- ------- ---
----- ------ - --- -------------- --------- --------- ---
------------------------ --- ---

-- -- ------- ----
---------------- -- -- -
  ------------------- ----- -- --------------------------------
---

这个示例中 'Hello, ${token.name}' 返回了用户的名称,提供认证授权功能。

步骤六:测试 GraphQL 服务器

现在我们已经设置了 GraphQL 服务器,我们可以使用任何类似于 GraphiQL、Apollo Client 的 GraphQL 客户端测试工具来进行测试。

在 HTTP headers 中添加 JWT,key 为 'Authorization', value 为 Bearer <token>, 其中 <token> 是 JWT 签名。

----- -
  -----
-

你会得到模仿这个形式的结果:

-
  ------- -
    -------- ------- ---- ----
  -
-

结论

GraphQL 是一种在 API 开发中相当流行的技术,而 JWT 是一种流行的认证和授权机制。使用这两种技术的结合,您可以创建安全的、可靠的 GraphQL API。本文介绍了如何在 GraphQL 中使用 JWT 实现认证和授权,并讨论了相关代码和配置。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/66fce5304471362601745cb0