GraphQL 中解决授权问题的指南

阅读时长 6 分钟读完

GraphQL 是一种用于 API 的查询语言,它具有强大的能力和灵活性。然而,随着 GraphQL 的广泛应用,授权问题变得日益重要。因此,在本文中,我们将探讨如何在 GraphQL 中处理授权问题。

什么是 GraphQL 授权?

GraphQL 授权是用于保障数据安全的一种机制,常常被用于限制用户访问数据。这个机制通常被用来限制用户访问一些私有数据,或者是仅允许受信任用户访问数据。在 GraphQL 技术中,只有在确保系统可以进行授权的情况下,才能保证系统的完整性和可靠性。

在 GraphQL 中如何进行授权?

在 GraphQL 中进行授权有很多方式,以下是一些处理 GraphQL 授权的最佳实践:

1. 使用 graphql-shield 包进行授权处理

graphql-shield 包使用了基于执行器的 GraphQL 解析器,可以用来处理查询方式。 graphql-shield 可以将你的查询封装在保护盾下,从而防止通过未经授权的方式来访问你的服务器,这种方式特别适合小型应用程序。

以下是一个处理授权的例子:

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

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

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

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

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

2. 使用自定义解析器进行授权处理

你可以自己编写解析器来授权访问。下面是一个简单的例子:

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

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

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

你可以在解析器中手动检查 user 对象,以此来授权访问。如果用户没有被授权,你可以通过 throw new Error 来防止访问。

3. 使用 graphql-auth-directives 进行授权处理

你可以使用 graphql-auth-directives 结合自定义指令来进行授权处理:

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

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

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

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

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

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

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

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

以下是自定义指令的实现:

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

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

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

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

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

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

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

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

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

这里我们在 SchemaDirectiveVisitor 类中定义了授权相关的行为,然后在创建 ApolloServer 对象的时候再将这些行为添加到指令中。

总结

以上就是在 GraphQL 中处理授权问题的一些建议。授权处理非常重要,需要我们花费认真的心态来处理。希望这篇文章可以帮助到读者,同时也提醒大家,一定要认真处理授权问题。

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

纠错
反馈