Authentication 微服务体系结构中的身份验证和授权

Authentication 微服务体系结构中的身份验证和授权,authentication,jwt,graphql,microservices,go-micro,Authentication,Jwt,Graphql,Microservices,Go Micro,我有多种服务: 使用者 职位 评论 认证 图形端点 假设它们是这样连接在一起的: 所有服务都通过gRPC在封闭网络上进行通信,授权使用jwt令牌完成 方法1: graphql服务负责用户身份验证,并确保用户有权运行指定的过程。服务之间没有用户身份验证,但有TLS身份验证。服务部门没有进行授权检查 方法2: 每个单独的服务都确保用户有权运行特定的程序。举个例子,你可以在一个帖子上投票,你需要在上面签名,并且你的声誉超过15。在这里,售后服务负责检查用户是否已登录(验证)以及是否有权投票。这将

我有多种服务:

  • 使用者
  • 职位
  • 评论
  • 认证
  • 图形端点
假设它们是这样连接在一起的:

所有服务都通过gRPC在封闭网络上进行通信,授权使用jwt令牌完成

方法1: graphql服务负责用户身份验证,并确保用户有权运行指定的过程。服务之间没有用户身份验证,但有TLS身份验证。服务部门没有进行授权检查

方法2: 每个单独的服务都确保用户有权运行特定的程序。举个例子,你可以在一个帖子上投票,你需要在上面签名,并且你的声誉超过15。在这里,售后服务负责检查用户是否已登录(验证)以及是否有权投票。这将导致巨大的开销,因为每个过程调用都需要通过Auth服务检查用户身份验证和授权

是否有一种更好的方法仍然保持方法2的安全性,但会像方法1那样产生较小的开销

----更新---

方法3:
与方法2相同,但用户身份验证仅在使用Auth服务的GraphQL服务中完成。授权是通过检查周围传递的元数据来完成的。服务之间存在TLS身份验证

>让我们考虑一个从认证用户到服务A和服务B的请求。JWT应该在每个调用上传递。 这两种服务都将首先对用户进行身份验证,这只需验证JWT即可。然后,每个服务将从用户中提取授权用户所需的所有信息,例如
sub
声明。它将使用此信息来决定用户是否被授权执行服务应代表用户执行的操作。只有在成功授权之后,服务才会真正执行任何操作


这不是开销,而是允许服务B对用户进行身份验证和授权所必需的。如果不将JWT从sercice A传递给服务B,服务B将无法了解用户的任何信息。

您的图表确实暗示两个服务之间可能存在调用。在方法2中,这样的调用如何进行身份验证:作为用户还是作为调用服务?只需要身份验证还是授权?似乎我混淆了身份验证和授权,所以更新了问题。回答你的问题;身份验证和授权将通过传递包含用户信息的jwt令牌来完成。在这种情况下,假设jwt令牌在到达服务B时过期,在这些情况下,JWT令牌是如何刷新的服务B将返回
401
到服务A,服务A将返回
401
到将获得新JWT的用户。我还有一个疑问,如果JWT令牌的生命周期是10分钟,即使在注销后,也可以访问API 10分钟,因为服务A将在本地检查JWT令牌的有效性(不是从AuthService重新检查)。但这是JWT的一个一般问题,与问题没有直接关系。如果服务a必须在身份验证服务上主动检查令牌的有效性,您可能会使用类似Kerberos的内容。但JWT并非故意使用Kerberos。