在微服务之间传递用户身份和授权

red*_*guy 6 authorization oauth jwt microservices

我很困惑 - 在微服务之间以异步方式传递用户身份(授权信息)的最佳方式是什么?

假设我已经有了处理身份验证和颁发 JWT 令牌的入口点(api 网关)。然后用户使用此令牌调用某个 API 端点。到此为止,一切都清楚了。现在 - 此端点需要与另一个微服务通信。该微服务必须获得授权信息(角色等)。此外 - 该通道是异步的(JMS/Kafka),这意味着处理可能会延迟......

我也在考虑其他情况:我们有两个服务 A 和 B。它们都公开了可能被外部用户访问的 API(JWT 令牌身份验证),但它们也需要异步协作(通过 JMS)。他们都需要用户身份上下文。再次 - 如何通过它?

我可以:

  1. 将 JWT 令牌与队列消息一起传递 - 安全吗?如果令牌在目标服务开始处理之前过期怎么办?
  2. 转换来自 JWT 令牌的信息并将其作为 HTTP 标头传递 - 如果目标服务返回信息怎么办 - 我需要从该响应中重新获得授权上下文(它仍然必须在特定用户的上下文中进行处理),但这使我可以处理两种类型的授权:JWT 和从异步进程返回的那个...
  3. ……?

他们对我都有缺点,我找不到通用的解决方案......

- 编辑

考虑案例:有产品目录服务和订购服务。两者都公开公共 API。用户下订单,它排队等待处理。第一步是验证产品是否正常以及是否允许用户订购。处理可能会调用产品目录服务,但必须传递用户上下文。这就是我要说的部分。

Sap*_*asu 5

你有

  1. 网关 -> MS1 -> Kafka -> Kafka Consumer -> MS2
  2. 网关 -> MS2

在第二种情况下,MS2 代表用户行事,因此用户的 JWT 在这里有意义。

在第一种情况下,Kafka Consumer 只是同步 MS1 中已经发生的操作。它不代表外部用户行事。外部用户在这里没有任何控制权。在此阶段用户不能读取或写入任何错误的内容。用户交互以 MS1 本身结束。

因此,Kafka Consumer 中不需要外部用户 JWT 来进行授权。但是,在消息中,您可以传递用户上下文(例如用户名)和其他相关详细信息以进行处理。根据这些信息,您需要决定是否继续订单。

然而,Kafka 消费者将需要它自己的访问令牌,该令牌将在所有不同的用户订单中使用。您需要在此处用于 Kafka 使用者和 MS2 之间通信的 OAuth 2.0 授权类型称为“客户端凭据”授权类型。

在这里,消费者将使用适当的凭据和客户端 ID 直接与授权服务器联系以获取访问令牌