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

时间:2019-02-15 15:46:52

标签: oauth authorization jwt microservices

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

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

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

我可以:

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

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

-编辑

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

1 个答案:

答案 0 :(得分: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直接与授权服务器联系以获取访问令牌