我有多种服务:
并说它们像这样连接在一起:
所有服务均通过封闭网络上的gRPC进行通信,并且授权使用jwt令牌完成
方法1:graphql服务负责用户身份验证,并确保授权用户运行指定的过程。服务之间没有用户身份验证,但是有TLS身份验证。服务不执行任何授权检查。
方法2:每个服务都确保用户被授权运行特定的过程。例如,在需要签名且声誉超过15的帖子上投票。在这里,邮政服务责任是检查用户是否已登录(已验证)以及用户是否有权投票。由于每个过程调用都需要通过Auth服务检查用户身份验证和授权,因此这将导致大量开销。
有没有一种更好的方法可以保留方法2的安全性,却又像方法1那样产生少量开销?
-----更新-----
方法3:与方法2相同,但是用户身份验证仅在GraphQL服务中使用Auth服务进行。通过检查传递给Arround的元数据来完成授权。服务之间存在TLS身份验证。
让我们考虑一个请求,该请求从经过身份验证的用户传递到服务A,再传递到服务B。JWT应该在这些调用中的每一个上传递。
两种服务都将首先对用户进行身份验证,这只需通过验证JWT即可完成。然后,每个服务将从用户那里提取授权用户所需的所有信息,例如sub
声明。它将使用此信息来确定用户是否有权代表服务执行该服务。只有获得成功的授权,服务才能真正执行任何操作。
这不是开销,而是允许服务B认证和授权用户所必需的。不将JWT从服务A传递到服务B,将使服务B无法了解有关用户的任何信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句