1

我有多种服务:

  • 用户
  • 邮政
  • 评论
  • 验证
  • GraphQL 端点

假设它们像这样连接在一起:

示例 1

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

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

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

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

- - -更新 - - -

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

4

1 回答 1

1

让我们考虑一个从经过身份验证的用户到服务 A 再到服务 B 的请求。JWT 应该在每个调用中传递。

两种服务都会首先对用户进行身份验证,这只需通过验证 JWT 即可完成。然后每个服务将从用户那里提取授权用户所需的所有信息,例如sub索赔。它将使用此信息来决定用户是否获得了服务代表用户执行的操作的授权。只有在成功授权之后,服务才会真正做任何事情。

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

于 2018-03-26T06:37:06.497 回答