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

时间:2017-10-05 13:57:49

标签: authentication jwt graphql relay

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

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

2 个答案:

答案 0 :(得分:2)

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

采用GraphQL时要注意;

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

以下是基于我实施GraphQL的经验的一些建议

验证

对于登录/退出/忘记密码和整个shebang,考虑去老派。表单Post + Server端呈现,REST API几十年来一直很好。许多第三方身份验证服务都基于此(Facebook登录,Google,OAuth2等)。我倾向于避免使用GraphQL来实现此目的。

授权

检查请求者是否授权访问GraphQL的逻辑可以推广到2个级别

GraphQL服务

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

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

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

细粒授权

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

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

这是将检查逻辑放在解析器(或模型)中真正有意义的地方。我个人认为解析器是一个很好的地方。与DataLoader相结合,实施仍然可以快速有效。

希望这有帮助!

答案 1 :(得分:0)

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

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

试试这个