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

问题描述 投票:1回答:1

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

让我们说我已经有了入口点(api网关),它可以进行身份​​验证并发布JWT令牌。然后用户使用此令牌调用某个API端点。到目前为止,一切都很清楚。现在 - 这个端点需要与另一个微服务进行通信。微服务必须获得授权信息(角色等)。此外 - 这个频道是异步的(JMS / Kafka),这意味着处理可能是dalayed ...

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

我可以:

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

所有这些都对我有利,我找不到通用解决方案......

- 编辑

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

oauth authorization jwt microservices
1个回答
0
投票

你有

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

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

在第一种情况下,Kafka Consumer正在同步MS1中已经发生的行为。它不代表外部用户行事。外部用户在此处没有任何控制权。在此阶段,用户无法读取或写入任何错误。用户交互以MS1本身结束。

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

然而,Kafka消费者需要它自己的访问令牌,这些令牌将用于所有不同的用户订单。您需要在此处用于Kafka使用者和MS2之间通信的OAuth 2.0授权类型称为"Client Credential"授权类型。

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

© www.soinside.com 2019 - 2024. All rights reserved.