在 GraphQL 中实现用户认证与授权

阅读时长 8 分钟读完

简介

如今,用户认证与授权是任何一个 Web 应用程序的基本要求之一。在 GraphQL 中实现用户认证与授权是一项具有挑战性的任务,因为 GraphQL 本身是一种 Query 语言,它提供了一种声明性的方式来描述数据的形状和类型。还需要考虑安全性和可扩展性。在本文中,我们将探讨如何在 GraphQL 中实现用户认证与授权。

用户认证

在 GraphQL 中,用户认证通常分为两个阶段。首先,用户需要通过身份验证来证明自己的身份。第二,用户需要授权才能够使用特定资源。

身份验证

身份验证是一种通过检查用户的凭据,确定用户是否有权访问资源的过程。在 GraphQL 中,身份验证可以由调用方和服务器之间的加密方式和协议控制。在实现 GraphQL 应用程序时,可以使用以下技术进行身份验证:

  • OAuth2:OAuth 2.0 是一种授权机制,它允许应用程序代表用户请求访问另一个应用程序的资源,以及获取访问令牌,用于将来访问授权服务器保护的资源。
  • OpenID Connect:OpenID Connect 是一个基于 OAuth 2.0 的身份验证协议,它扩展了令牌功能,从而提供用户身份标识和认证。

在 GraphQL 中,通常需要在请求头中传递访问令牌或者授权码来实现身份验证。

授权

在完成身份验证后,下一步是授权。授权是一种确定用户是否有权访问资源的过程。GraphQL 提供了基于声明和满足角色需求的访问控制。

GraphQL 的请求和响应是声明性的。这就意味着调用方可以声明自己必须访问的数据和需要修改的数据,而服务器可以解释这些声明并确定哪些数据可以返回。在实现访问控制时,可以组合 Web 服务器技术,比如使用 JWT、OAuth 2.0 等。可以使用以下技术实现访问控制:

  • JWT:JSON Web Tokens (JWTs) 是一种基于 JSON 的 Token 格式,它可以用于在多个系统之间安全地传递信息,并且包含有关用户的信息。
  • OAuth 2.0:OAuth 2.0 不仅提供了身份验证,还提供了授权机制,从而使您能够在应用程序之间共享信息。

我们可以使用这些技术来在 GraphQL 中实现访问控制。

实现

这里我们用 JavaScript 示例代码来演示如何在 GraphQL 中实现用户认证与授权。

1. 使用 passport.js 进行身份验证

首先使用 passport.js 进行身份验证。Passport 是 Node.js 的身份验证中间件,支持多种策略,比如本地认证、OAuth2、OpenID 等。

首先安装 passport-js:

然后,在 Apollo Server 中添加 passport.js 策略:

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

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

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

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

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

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

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

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

2. 实现 GraphQL 的身份验证

在 GraphQL 中处理身份验证是通过使用上下文来实现的。上下文在执行 Resolver 时传递给 Resolver 函数。

可以在 Apollo Server 的 context 配置中定义 context 函数,并在其中设置身份验证令牌:

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

在上下文中,我们将 req 和 res 传递给取消身份验证的端点,将 currentUser 设置为当前用户。

然后,我们可以在 GraphQL Resolvers 中使用上下文 currentUser 值来确定当前用户:

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

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

3. 实现 GraphQL 的授权

实现访问控制的方法之一是使用自定义 Scalars。在 GraphQL 中,Scalars 是指没有任何子字段的值类型。例如,日期和时间可以映射到 Scalar 值,而不需要嵌套的字段。自定义景点 Scalars 可以用于处理很多事情,比如必须是数字、字符串等。

我们可以自定义一个 Scalars,如下:

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

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

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

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

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

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

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

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

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

在 Resolver 中使用它,如下:

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

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

以上代码将确保只有经过身份验证且是管理员的用户才能够创建 Post 的记录。

结论

在 GraphQL 中实现用户认证与授权可以成为一项具有挑战性的任务,但是我们可以使用一些有效的方式来解决这个问题。 在本文中,我们讨论了身份验证和访问控制的概念,以及如何在 GraphQL 中实现几种不同的认证和授权技术。我们还探讨了如何在 GraphQL Resolvers 中使用自定义 Scalars 来处理访问控制。现在我们已经有了一个可以在 GraphQL 中应用的基础模型,您可以使用它来启动自己的应用程序,并掌握身份验证和访问控制。

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

纠错
反馈