【问题标题】:Authentication with JWT using GraphQL使用 GraphQL 使用 JWT 进行身份验证
【发布时间】:2018-03-17 04:28:18
【问题描述】:

在网上搜索后,我发现使用 GraphQL 时 JWT 身份验证的最佳方式是将 JWT 令牌插入到 GraphQL 上下文中。通过这样做,解析器可以访问它并检查用户是否已登录、是否具有权限等。

我想知道是否需要将身份验证逻辑/功能放入需要身份验证的每个解析器中。除了登录/注销/注册/忘记密码之外,有没有一种方法可以默认设置(例如中间件)对每个查询的身份验证?

【问题讨论】:

    标签: authentication jwt graphql relay


    【解决方案1】:

    这个问题经常出现,但讨论得还不够多。我认为答案不在于技术,而在于哪种方式最适合您的需求。

    在采用 GraphQL 时要注意这一点;

    • 您不必放弃 REST
    • 您可以拥有多个 GraphQL 端点

    以下是根据我实施 GraphQL 的经验提出的一些建议

    认证

    对于登录/注销/忘记密码和整个shebang,请考虑使用老派。 Form Post + 服务器端渲染,REST API 为我们服务了几十年。许多第三方身份验证服务都基于此(Facebook 登录、谷歌、OAuth2...等)。为此,我倾向于避免使用 GraphQL。

    授权

    检查请求者是否被授权访问 GraphQL 的逻辑可以概括为 2 个级别

    GraphQL 服务

    基本上你检查请求者是否被授权使用 GraphQL 服务。通常更容易检查请求者是否经过身份验证,否则完全拒绝访问服务。这通常通过 Web 服务器中间件完成。

    有时您需要向匿名用户公开一些 GraphQL 查询,我倾向于使用另一个“不受限制”的 GraphQL 端点。该端点往往几乎没有突变,暴露了有限的信息子集和受限的嵌套查询。

    基本上,您会查看数据并决定哪些信息/操作是公开的,哪些不是。 IMO 这比拥有单个 GraphQL 端点并在每个查询路径/解析器中实施授权检查点更容易管理和保护。

    细粒度授权

    在这个阶段,基本上所有的请求者都是经过身份验证的用户。我们可能需要提问:

    • 请求者是否与当前查看其信息的用户相同?
    • 请求者是当前查看其信息的用户的朋友吗?
    • 请求者是当前查看其信息的公司的成员吗?

    这就是将检查逻辑放入解析器(或模型)的真正意义所在。我个人认为解析器是这样做的好地方。再加上DataLoader,实现仍然可以快速有效。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      无需检查解析器。您可以在服务器端添加中间件。

      const graphQLServer = express();
      graphQLServer.use('/graphql', function(req, res, next) {
        var token = req.headers.token;
        if (token != null && token != 'undefined') {
          //Do token verification here
          next();
        } else {
      
          // if there is no token
          // return an error
          return res.status(403).send({
            success: false,
            message: 'No token provided.'
          });
        }
      })

      试试这个

      【讨论】:

        猜你喜欢
        • 2018-11-10
        • 2016-04-07
        • 1970-01-01
        • 2016-12-17
        • 2023-03-27
        • 2021-05-29
        • 2017-07-30
        • 2018-06-30
        • 2018-08-03
        相关资源
        最近更新 更多