在微服务之间传播访问令牌
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
方法。
注意:order
和 inventory
微服务都充当资源服务器。
什么是正确的方法。
【问题讨论】:
我认为您所描述的是orders
和inventory
服务充当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以上是关于在微服务之间传播访问令牌的主要内容,如果未能解决你的问题,请参考以下文章