我很困惑-在微服务之间以异步方式传递用户身份(授权信息)的最佳方法是什么?
让我们说我已经有入口点(api网关)来处理身份验证并颁发JWT令牌。然后,用户使用此令牌调用一些API端点。至此,一切都变得清晰了。现在-该端点需要与另一个微服务进行通信。该微服务必须获取授权信息(角色等)。 另外-该通道是异步的(JMS / Kafka),这意味着处理可能会延迟...
我还在考虑其他情况:我们有两个服务A和B。它们都公开了可能由外部用户访问的API(JWT令牌身份验证),但它们还需要异步协作(由JMS)。它们都需要用户身份上下文。再次-如何通过?
我可以:
所有这些都对我不利,我找不到通用的解决方案...
-编辑
考虑案例:提供产品目录服务和订购服务。两者都公开公共API。用户下订单,它排队等待处理。第一步是验证产品是否合格以及是否允许用户订购产品。处理过程可能会调用产品目录服务,但必须传递用户上下文。这是我正在谈论的部分。
答案 0 :(得分:0)
您有
在第二种情况下,MS2代表用户运行,因此此处的用户JWT有意义。
在第一种情况下,Kafka Consumer只是同步MS1中已经发生的动作。它不代表外部用户。外部用户在这里没有任何控制权。用户在此阶段无法读取或写入任何错误的内容。用户交互以MS1本身结束。
因此,Kafka Consumer中不需要外部用户JWT进行授权。但是,在消息中,您可以传递用户上下文(如用户名和其他相关详细信息)进行处理。根据这些信息,您需要决定是否继续执行该订单。
但是,Kafka消费者将需要它自己的访问令牌,这些令牌将在所有不同的用户订单中使用。您需要在此处用于Kafka使用者与MS2之间的通信的OAuth 2.0授权类型称为"Client Credential"授权类型。
此处,消费者将使用适当的凭据和客户端ID直接与授权服务器联系以获取访问令牌