认证和授权 —— 保护您的 GraphQL API

GraphQL 是一个由 Facebook 开发的 API 查询语言和运行时。它提供了一个API层,使得客户端可以按照自己的需要精确获取所需的数据,缩短了客户端到服务器之间的通信时间。GraphQL 替代了 RESTful API,以减少数据检索的冗余,提高了Web应用程序的性能。然而,GraphQL API服务器的安全性问题同样需要我们关注。在本文中,我们将探讨如何利用认证和授权来保护 GraphQL API。

认证

认证的目的在于确认某个用户或者应用程序是否有权访问 API 中的某些资源。不同的认证方式有不同的优缺点,应根据实际需求选择。常见的方法有:基于cookie和session的认证、JWT (JSON Web Tokens)认证、OAuth认证等。

基于cookie和Session的认证在web应用中很常见。它工作于HTTP上,并且需要在服务器端维护Session的状态。Session通过存储跟踪ID在浏览器端和服务器端进行维护。浏览器在第一次请求时,发送一个POST请求进行用户认证。服务器端验证通过后,网站将生成一个 SessionID,存储于客户端的 cookie中。之后,当客户端发出请求时,这个 SessionID 将会被发送到服务器进行身份验证。

JWT 是一个开放标准 (RFC 7519),它定义了一种紧凑且自包含的方式来在各方之间作为 JSON 对象安全地传输信息。JWT 在传输数据方面有很高的兼容性,可以方便地用于跨域、移动设备和基于 Web 的应用程序。它可以使用公钥/私钥对进行签名,使得 JWT 更加安全。

OAuth 是允许用户授权第三方应用访问其资源的协议。可以使用OAuth认证为将用户信息与其他结构分离提供支持。用户在首次登录时,需要授权给第三方平台访问其账户信息,之后授权令牌被分配给该token。 之后,每次向API发送请求时,它将始终附带这个令牌。

授权

授权允许您确定成功进行身份验证的用户或应用程序是否拥有访问API某些资源的权限以及他们能访问的内容。 GraphQL 便携式、高度可定制的程序设计范式,使得使得为不同的用户提供不同的权限变得容易。使用 GraphQL,您可以定义自己的数据访问层级,对于每一个具体的用户选择怎么样暴露哪些字段。

下面我们以JWT为例,介绍如何在 GraphQL API 中实现授权

1.首先,创建JWT模块,用户鉴权后,JWT模块会创建一个token,该token将替代用户名、密码用于授权。

------ ---

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

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

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

2.在 GraphQL schema 中指定 Field level 权限调用

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

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

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

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

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

在上述示例代码中,当用户调用API时,@jwt_required()装饰器对数据进行身份验证。如果身份验证通过,将在 func 内创建一个 UserType 并返回它。

总结

综上所述,认证和授权对于保护 GraphQL API 很关键。传统 Web 应用程序中的认证和授权方法可用于 GraphQL API,但是为了更好地适应 GraphQL,我们应该利用GraphQL的优点,使用GraphQL自带的特性进行授权。给GraphQL实现正确的授权可以防止访问未授权的数据,保护用户信息以及重要的内部逻辑,这对于构建安全高效的 GraphQL API 是非常重要的。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/652f287a7d4982a6eb03e0ce


猜你喜欢

相关推荐

    暂无文章