在 Node.js 中使用 GraphQL 实现授权验证

阅读时长 7 分钟读完

GraphQL 是一种用于 API 的查询语言和运行时环境,它可以让客户端准确地获取它需要的数据,并且没有任何冗余。在 Node.js 中使用 GraphQL 实现授权验证可以让我们更好地保护我们的 API,只有经过身份验证的用户才能访问受保护的资源。

本文将介绍如何在 Node.js 中使用 GraphQL 实现授权验证,并提供示例代码。

什么是授权验证?

授权验证是一种保护 API 免受未经授权的访问的机制。它通过验证用户的身份和权限来控制对 API 资源的访问。在授权验证中,用户必须提供有效的身份验证凭据,并且必须具有访问所请求资源的权限。

在 Node.js 中使用 GraphQL 实现授权验证需要以下步骤:

  1. 定义 GraphQL 的 schema,包括受保护的资源和查询和变更操作。
  2. 实现 GraphQL 的 resolver,用于处理查询和变更操作。
  3. 实现授权验证逻辑,以确保只有经过身份验证的用户才能访问受保护的资源。

我们将逐一介绍这些步骤。

定义 GraphQL 的 schema

首先,我们需要定义 GraphQL 的 schema。在 schema 中,我们需要定义受保护的资源和查询和变更操作。例如,考虑以下 schema:

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

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

---- ---- -
  --- ---
  ----- -------
  ------ -------
-
展开代码

在这个 schema 中,我们定义了一个受保护的资源 me,它返回当前经过身份验证的用户的信息。我们还定义了一个变更操作 updateProfile,它允许经过身份验证的用户更新他们的个人资料。

实现 GraphQL 的 resolver

接下来,我们需要实现 GraphQL 的 resolver,用于处理查询和变更操作。在 resolver 中,我们需要实现查询和变更操作的具体逻辑。例如,考虑以下 resolver:

-- -------------------- ---- -------
----- --------- - -
  ------ -
    --- -------- ----- - ---- -- -- -
      -- ------- -
        ----- --- ---------- ---------------
      -
      ------ ----
    --
  --
  --------- -
    -------------- -------- - ----- ----- -- - ---- -- -- -
      -- ------- -
        ----- --- ---------- ---------------
      -
      --------- - ----
      ---------- - -----
      ------ ----
    --
  --
-
展开代码

在这个 resolver 中,我们实现了 me 查询和 updateProfile 变更操作。在 me 查询中,我们首先检查用户是否已经经过身份验证,如果没有,则抛出错误。在 updateProfile 变更操作中,我们也首先检查用户是否已经经过身份验证,如果没有,则抛出错误。然后,我们更新用户的个人资料,并返回更新后的用户信息。

实现授权验证逻辑

最后,我们需要实现授权验证逻辑,以确保只有经过身份验证的用户才能访问受保护的资源。在 Node.js 中,我们可以使用中间件来实现授权验证逻辑。例如,考虑以下中间件:

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

----- ----------- - ------- -- -
  -- ----- -- --- ----
  ------ ----
-
展开代码

在这个中间件中,我们首先从请求头中获取 JWT 令牌。如果没有令牌,则返回未经身份验证的错误。然后,我们使用 JWT 验证逻辑验证令牌,并将用户信息添加到请求中。最后,我们调用 next() 函数,将请求传递给下一个中间件。

在使用 GraphQL 的时候,我们可以将这个中间件添加到 GraphQL 的路由中:

在这个路由中,我们首先调用 authenticate 中间件进行身份验证。如果身份验证通过,则将请求传递给 GraphQL 的处理程序。

示例代码

下面是一个完整的示例代码,它演示了如何在 Node.js 中使用 GraphQL 实现授权验证:

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

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

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

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

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

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

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

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

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

---------------- -- -- -
  ------------------- ------- -- ---- ------
--
展开代码

在这个示例中,我们定义了一个 GraphQL schema,包括一个受保护的资源 me 和一个变更操作 updateProfile。然后,我们实现了 GraphQL resolver,用于处理查询和变更操作。最后,我们实现了一个身份验证中间件,用于保护受保护的资源。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67cbe7c0e46428fe9e5074b3

纠错
反馈

纠错反馈