2017-10-05 71 views
1

网络上的一些搜索后,我发现,使用GraphQL当智威汤逊认证的最好的方法是通过将JWT令牌到GraphQL上下文。通过这样做,解析器可以访问它并检查用户是否已登录,是否具有权限等。认证与JWT使用GraphQL

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

回答

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

刚刚尝试这一点

1

这个问题弹出,每隔一段时间,但不足以进行了讨论。我认为答案不在于技术,而在于哪种方式最适合您的需求。

采用GraphQL,当要留神是很重要的;

  • 你不必放弃对REST
  • 你可以有

这是基于一些建议,我的经验与实施GraphQL

多个 GraphQL端点验证

对于登录/注销/忘记密码和整个家当,考虑去老-SCH OOL。 Form Post +服务器端渲染,REST API几十年来为我们提供了良好的服务。许多第三方认证服务都基于此(Facebook登录,Google,OAuth2等)。我倾向于避免为此使用GraphQL。

授权

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

GraphQL服务

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

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

基本上,你看看数据,并决定哪些信息/操作公众和这不是。 IMO比单个GraphQL端点更容易管理和安全,并且在每个查询路径/解析器中实现授权检查点。

细粒度授权

在这个阶段基本上,所有请求者被认证的用户。我们可能需要质疑:

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

这是投入解析器(或模型)检查逻辑真的很有意义。我个人认为,解决方案是一个很好的选择。加上DataLoader的实施仍然可以快速有效。

希望这会有所帮助!