微服务架构中的认证与授权
Authentication and authorisation in microservice architecture
我有多项服务:
- 用户
- Post
- 评论
- 身份验证
- GraphQL 端点
假设它们是这样连接在一起的:
所有服务都通过封闭网络上的 gRPC 进行通信,授权是使用 jwt 令牌完成的
方法一:
graphql 服务负责用户身份验证,并确保用户有权 运行 指定的过程。服务之间没有用户认证,但是有TLS认证。这些服务没有进行授权检查。
方法二:
每个单独的服务都确保用户有权 运行 特定程序。一个例子可能是在 post 上投票,您需要登录并拥有超过 15 的声誉。这里 Post 服务负责检查用户是否已登录(经过身份验证)以及是否有权投票。这将导致大量开销,因为每个过程调用都需要通过 Auth 服务检查用户身份验证和授权。
是否有更好的方法仍然保留方法 2 的安全性,但会产生像方法 1 一样的小开销?
-----更新-----
方法三:
与方法 2 相同,但用户身份验证仅在使用 Auth 服务的 GraphQL 服务中完成。授权是通过检查周围传递的元数据来完成的。并且服务之间有TLS认证。
让我们考虑从经过身份验证的用户到服务 A 再到服务 B 的请求。JWT 应该在这些调用中的每一个上传递。
这两种服务都将首先验证 用户,只需验证 JWT 即可完成。然后每个服务将从用户那里提取授权用户所需的所有信息,例如sub
声明。它将使用此信息来决定用户是否已获得服务代表用户执行的操作的授权。只有成功授权后,该服务才会真正执行任何操作。
这不会是开销,但对于允许服务 B 对用户进行身份验证和授权是必需的。不将 JWT 从服务 A 传递到服务 B 将使服务 B 无法了解用户的任何信息。
我有多项服务:
- 用户
- Post
- 评论
- 身份验证
- GraphQL 端点
假设它们是这样连接在一起的:
所有服务都通过封闭网络上的 gRPC 进行通信,授权是使用 jwt 令牌完成的
方法一: graphql 服务负责用户身份验证,并确保用户有权 运行 指定的过程。服务之间没有用户认证,但是有TLS认证。这些服务没有进行授权检查。
方法二: 每个单独的服务都确保用户有权 运行 特定程序。一个例子可能是在 post 上投票,您需要登录并拥有超过 15 的声誉。这里 Post 服务负责检查用户是否已登录(经过身份验证)以及是否有权投票。这将导致大量开销,因为每个过程调用都需要通过 Auth 服务检查用户身份验证和授权。
是否有更好的方法仍然保留方法 2 的安全性,但会产生像方法 1 一样的小开销?
-----更新-----
方法三: 与方法 2 相同,但用户身份验证仅在使用 Auth 服务的 GraphQL 服务中完成。授权是通过检查周围传递的元数据来完成的。并且服务之间有TLS认证。
让我们考虑从经过身份验证的用户到服务 A 再到服务 B 的请求。JWT 应该在这些调用中的每一个上传递。
这两种服务都将首先验证 用户,只需验证 JWT 即可完成。然后每个服务将从用户那里提取授权用户所需的所有信息,例如sub
声明。它将使用此信息来决定用户是否已获得服务代表用户执行的操作的授权。只有成功授权后,该服务才会真正执行任何操作。
这不会是开销,但对于允许服务 B 对用户进行身份验证和授权是必需的。不将 JWT 从服务 A 传递到服务 B 将使服务 B 无法了解用户的任何信息。