【问题标题】:Calling service B from service A for authentication and authorization从服务 A 调用服务 B 进行身份验证和授权
【发布时间】:2021-08-26 05:42:04
【问题描述】:
我有服务Ticketing 和服务Auth。
并非所有人都可以对票证执行 CRUD。
当请求来执行票证的操作时,我需要检查用户是否具有适当的权限。
为此,我需要与服务Auth 进行通信,该服务持有用户对资源的允许权限的角色和端点。
我该如何拨打这个电话?
- 我应该进行同步呼叫吗?即从服务 A 直接调用 B?
- 使用事件总线
或者其他任何可能的方式?
另外,Auth 服务需要一些表才能与Ticketing 服务连接以获取数据。
如何解决这个问题?
【问题讨论】:
标签:
node.js
architecture
microservices
【解决方案1】:
鉴于微服务标签,我假设 Ticketing 和 Auth 是独立的微服务。
根据描述,我还假设每个都有自己的 API。
不太清楚的是用户如何访问Ticketing 服务。他们是否首先通过身份验证(例如,如果人类用户通过 Web 应用程序,他们是否先登录,然后以某种方式被定向到 Ticketing)。
我假设首先执行了登录。
一种方法可能是
- 在用户登录时(或调用者,如果不是人类),获取用户可以通过
Auth 服务访问的授权列表。
- 将授权存储在 HTTP 授权标头中
- 在调用每个微服务时,它只需要(同步)询问
Auth 服务来验证授权列表是否正确。
适当的技术方法是JWT。
在上述场景中,当首次调用 Auth 来验证用户/调用者时,可以在 sub 声明中返回授权,或者您可以创建自己的声明来确定使用的授权。
当用户/调用者在不同的微服务中移动时,只需对Auth 服务进行同步调用以验证用户/调用者是否已获得授权。
同步或异步:无论直接调用/事件总线,如果需要授权检查,则需要在调用服务采取行动之前完成。否则,当调用者没有授权时,它可能会暴露数据/修改它。
联接表:在微服务模式中,这不太可能是明智的。相反,通过 API 调用从 Auth 服务获取所需的数据并将其与调用服务一起使用(例如 Ticketing)。