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

Authentication 使用GraphQL与JWT进行身份验证,authentication,jwt,graphql,relay,Authentication,Jwt,Graphql,Relay,在web上搜索之后,我发现使用GraphQL时,JWT身份验证的最佳方式是将JWT令牌插入GraphQL上下文。通过这样做,解析程序可以访问它,并检查用户是否已登录、是否具有权限等 我想知道是否需要将身份验证逻辑/函数放入每个需要身份验证的解析器中。除了登录/注销/注册/放弃密码查询之外,是否有一种方法可以默认设置每个查询的身份验证(如中间件) 这个问题经常出现,但讨论得不够。我认为答案不在于技术,而在于哪种方式最适合您的需要 在采用GraphQL时,重要的是要注意: 你不必放弃休息 您可以有

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


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

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

在采用GraphQL时,重要的是要注意:

  • 你不必放弃休息
  • 您可以有多个GraphQL端点
根据我实现GraphQL的经验,下面是一些建议

认证

登录/注销/忘记密码和整个SUBANG,考虑去旧学校。从Post+服务器端呈现开始,RESTAPI为我们提供了数十年的良好服务。许多第三方身份验证服务都基于此(Facebook登录、谷歌、OAuth2等)。为此,我倾向于避免使用GraphQL

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

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

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

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

细粒度授权 在此阶段,所有请求者基本上都是经过身份验证的用户。我们可能需要提出以下问题:

  • 请求者是否与当前查看其信息的用户相同
  • 请求者是当前查看其信息的用户的朋友吗
  • 请求者是否是当前查看其信息的公司的成员
这就是将检查逻辑放在解析器(或模型)中真正有意义的地方。我个人认为解析器是实现这一点的好地方。再加上实施仍然可以快速有效


希望这有帮助

无需签入解析程序。您可以在服务器端添加中间件

const graphQLServer=express();
graphQLServer.use('/graphql',函数(req,res,next){
var token=req.headers.token;
if(令牌!=null&&token!=“未定义”){
//在这里进行令牌验证
next();
}否则{
//如果没有代币
//返回错误
返回资源状态(403)。发送({
成功:错,
消息:“未提供令牌。”
});
}
})