使用 GraphQL 通过 JWT 进行身份验证

Authentication with JWT using GraphQL

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

我想知道是否需要将身份验证 logic/function 放入每个需要身份验证的解析器中。有没有一种方法可以默认设置(例如中间件)对除 login/logout/register/forgotpasword 之外的每个查询的身份验证?

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

采用 GraphQL 时请务必注意;

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

根据我实施 GraphQL 的经验,这里有一些建议

身份验证

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

授权

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

GraphQL 服务

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

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

基本上,您查看数据并决定哪个 information/operation 是 public,哪个不是。在我看来,这比使用单个 GraphQL 端点并在每个查询中实施授权检查点更容易管理和保护 path/resolver。

细粒度授权

现阶段基本上所有的请求者都是认证用户。我们可能需要提问:

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

这就是将检查逻辑放入解析器(或模型)真正有意义的地方。我个人认为解析器是执行此操作的好地方。加上 DataLoader 实施仍然可以快速有效。

希望对您有所帮助!

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

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.'
    });
  }
})

试试这个