在微服务之间传播访问令牌

Posted

技术标签:

【中文标题】在微服务之间传播访问令牌【英文标题】:propagating access token between microservices 【发布时间】:2021-12-06 13:58:13 【问题描述】:

我正在开发微服务应用程序,其中客户端应用程序通过POST 调用将access token 发送到orders 微服务。保存订单时,需要调用库存微服务来更新库存。 Inventory 微服务updateIntentory 方法也应该受到保护。

在这个用例中,我应该将相同的 access token 传播到 inventory 微服务并限制 api 访问以更新库存,还是应该使用 client-credentials 授权流来允许 saveOrder 方法在order微服务调用inventory microservice中的updateInventory方法。

注意:orderinventory 微服务都充当资源服务器。 什么是正确的方法。

【问题讨论】:

我认为您所描述的是ordersinventory 服务充当resource server。如果orders服务调用inventory,你可以实现token-relay模式或者使用client_credentials和一个单独的client_id,这取决于两个服务是否共享相同的授权方案。 @SteveRiesenberg 订单和库存微服务都充当资源服务器。如何实现token-relay 模式?另外,authorization scheme 是什么 在 cmets 提出新问题之前请先 google。 @SteveRiesenberg 我没有找到任何实用指南,因此在评论中询问。 “授权方案”是指您的应用程序对授权的要求。例如,如果两个服务都需要ROLE_USER 来执行所需的操作,而一个需要与另一个完全不同的访问级别;另一个例子是,您是否确定用户可以在两种服务之间以相同的方式访问什么,而不是非常不同的方式。 【参考方案1】:

好问题:

边界

如果您正在调用属于其他人的外部 API,您肯定会使用客户端凭据来获取授权您调用该 API 的令牌。

微服务

如果数据所有者相同,那么您应该简单地转发访问令牌。这就是 OAuth 的工作方式:一个只需要简单代码的可扩展架构:

客户端获取具有多个 API 范围的访问令牌 每个 API 都会验证 JWT 每个 API 都验证自己的范围 每个 API 都信任 JWT 中的声明并将其用于授权

Scope Best Practices 文章针对真实世界的系统解释了这一点。

高权限操作

通常会为高安全性操作获取新令牌,例如使用支付范围重定向用户。不过,这应该是例外而不是规则。

【讨论】:

如何将令牌从一个微服务传播到另一个?自从 OAuth2RestTemplate 在 Spring Boot 中被弃用以来,是否有标准方法。 只需一个简单的 HTTP 请求 - 例如使用 Apache HTTP 客户端。您所要做的就是在 HTTP 授权标头中发送不记名令牌 - 避免使用 Spring Security 进行简单的 API 调用。见this guide

以上是关于在微服务之间传播访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

JWT 注销:在微服务架构中的服务之间共享被列入黑名单的无效令牌

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

使用 jwt 在微服务中进行身份验证

微服务之间的访问令牌/授权

用Token令牌维护微服务之间的通信安全的实现

如何在微服务中添加基于 Jwt 令牌的安全性