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

Oauth 在微服务之间传递用户身份和授权,oauth,authorization,jwt,microservices,Oauth,Authorization,Jwt,Microservices,我很困惑——以异步方式在微服务之间传递用户身份(授权信息)的最佳方式是什么 假设我已经有了处理身份验证和发布JWT令牌的入口点(api网关)。然后用户使用该令牌调用某个API端点。到目前为止,一切都很清楚。现在-该端点需要与另一个微服务通信。该微服务必须获得授权信息(角色等)。 另外-此通道是异步的(JMS/Kafka),这意味着处理可能会延迟 我还考虑了另一种情况:我们有两个服务A和B。它们都公开了外部用户可能访问的API(JWT token auth),但它们也需要异步协作(通过JMS)。它

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

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

我还考虑了另一种情况:我们有两个服务A和B。它们都公开了外部用户可能访问的API(JWT token auth),但它们也需要异步协作(通过JMS)。它们都需要用户身份上下文。再说一遍——怎么通过

我可以:

  • 将JWT令牌与队列消息一起传递-安全吗?如果令牌在目标服务开始处理之前过期怎么办
  • 从JWT令牌转换信息并将其作为HTTP头传递-如果目标服务返回信息会怎样-我需要从该响应中重新获得授权上下文(它仍然必须在特定用户的上下文中处理),但这使我能够处理两种类型的授权:JWT和从异步进程返回的授权
  • 他们都有我的缺点,我找不到普遍的解决办法

    --编辑

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

    你有

  • 网关->MS1->卡夫卡->卡夫卡消费者->MS2
  • 网关->MS2
  • 在第二种情况下,MS2代表用户,因此用户的JWT在这里是有意义的

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

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

    然而,卡夫卡消费者将需要它自己的访问令牌,这些令牌将在所有不同的用户订单中使用。您需要在这里使用OAuth 2.0授权类型来进行Kafka使用者和MS2之间的通信,该类型称为授权类型


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

    当您通过队列推送jwt时,为什么需要通过jwt?。队列已经只能由授权的客户端访问,您只需在客户端之间传递消息即可。队列的目的是使消息保持足够长的长度,以创建松散耦合的微服务。但是,要通过http访问api,必须传递授权标头。我想传递授权信息。用户是经过身份验证的,这是真的,但我还需要他的角色、租户上下文等…我还需要调用后续服务的能力,因此传递jwt也可以解决这个问题…如果您确实想发送jwt令牌,那么请增加到期时间(几分钟就可以了)。它应该能够承受队列不可用。只要令牌得到了适当的保护并且已经通过了安全队列通道,传递令牌就可以了。听起来合法,但是它需要MS2处理两种授权(角色)情况——一种来自外部API(jwt),另一种来自“内部API”——来自kafka侦听器的调用。我说得对吗?我的意思是-如果这是正确的方法,那么就可以了,只需要确保@redguy Spring OAuth 2.0实现可以同时支持多种授予类型。它还支持客户端凭据授予类型,但这种授予类型是否意味着不仅仅是“某个名称”?每个授予类型都有一个单独的流。不知道我是否理解你的疑问。也许你应该看看我在回答中链接的RFC。在接受答案之前,我必须阅读更多关于客户认证授予的信息。它似乎解决了我的部分问题——提供了一致的身份验证并简化了微服务配置。至于传递用户上下文,我决定在使用客户机凭据grant调用用户上下文的userId call auth api服务时,只传递userId和目标服务。