7

我们的系统正在从单体架构转变为微服务架构。微服务架构带来了我们需要解决的技术挑战,其中之一就是 AuthN/AuthZ。

我们的方法是使用身份验证服务来验证用户并生成访问/刷新令牌 (JWT)。然后访问令牌将通过微服务链在请求标头中传递,这样每个微服务只需验证令牌即可确定用户已成功通过身份验证。对于 AuthZ 部分,权限执行是在微服务本身中完成的。我的问题与 AuthZ 有关。

为了说明这个话题,让我们举一个具体的例子,一个接待员想要注册一个新成员到他的保真程序,例如从一个 Web 应用程序。为了支持这个用例,我们假设系统有 2 个微服务,ReceptionService 和 MemberService。ReceptionService 提供一个 REST API 来启动成员注册流程。它需要用户权限“注册”才能执行。MemberService 提供一个 REST API 来创建受 CRUD 权限保护的新成员资源。请求流将是:

  1. 用户先前登录的 Web 应用程序向 ReceptionService API 发送成员注册请求,其中包括标头中的用户访问令牌。
  2. ReceptionService 验证用户令牌,确保用户被授予“注册”权限,执行它需要执行的任何业务逻辑,最后向 MemberService API 发送一个成员创建请求,包括头部中的用户访问令牌。
  3. MemberService 验证用户令牌,确保授予用户“member.create”权限,最后创建成员。

为了为这种情况设计解决方案,我的团队致力于以下假设/先决条件:

  • 微服务必须始终强制执行权限(至少对于重要的 API 操作,例如创建成员)。因此,即使产品经理可能只需要顶级“注册”权限,上例中 MemberService 的 CRUD 权限也是如此。
  • 因为具有“顶级”权限而能够启动用例的用户必须能够完成它。含义它不会因为他缺少来自底层服务调用链中某处的另一个权限而出错。
  • 管理员用户不必了解执行用例所需的权限链。在我们的示例中,管理员应该只能向用户提供“注册”权限。

为了能够完成上述示例,需要为用户分配 2 个不同的权限,这打破了我们的一些假设/先决条件。为了克服这个问题,我的一位同事建议考虑在我们的 AuthN 系统中将微服务声明为身份/用户,以便为它们分配适当的权限。然后,最初提供的用户令牌将被调用链中的参与服务令牌替换。回到这个例子,新的请求流程是:

  1. 用户先前登录的 Web 应用程序向 ReceptionService API 发送成员注册请求,其中包括标头中的用户访问令牌。

  2. ReceptionService 验证用户令牌,确保授予用户“注册”权限,执行它需要执行的任何业务逻辑,最后向 MemberService API 发送一个成员创建请求,在标头中包含它自己的服务令牌(因此替换原始用户令牌)。

  3. MemberService 验证服务令牌,确保服务被授予“member.create”权限,最后创建成员。

使用此解决方案,AuthN 系统中的服务身份将被标记为从管理权限分配的管理员用户中过滤出来。服务身份的权限分配将是预先定义的,用户无法对其进行配置。虽然它满足了我们的假设/先决条件,但我对这种方法几乎没有担忧:

  • 在处理“谁做了什么”(审计)时,令牌中提供的用户身份和服务身份将被冷淡列出。在我们的示例中,RegistrationService 将审核发起操作的实际用户,但 MemberService 将审核该操作是由“RegistrationService”执行的。在报告场景中,这意味着我需要协调来自两个系统的审计,以确定“谁实际创建了成员”,以某种方式使用关联 ID。
  • 虽然我了解在不涉及实际用户的情况下需要为系统组件创建身份(自动批处理/第三方访问..),但在以下情况下我不习惯用服务令牌替换用户令牌用户实际启动了用例。这是标准的设计模式吗?

会不会是我们的一些假设/先决条件错了?

  • 例如,某些微服务即使仅
    在安全环境中由其他受控微服务访问,也不会强制执行权限,这真的是一个安全漏洞吗?假设
    后者的答案是“不,这不会是一个安全漏洞”,那么如果明天,我需要让 MemberService API 也可以
    在安全环境之外访问(例如,因为我将它
    提供给第三方派对)。我很可能需要对其添加
    权限,这会破坏我的注册流程。
  • 说我们确实希望管理员用户知道
    用例需要哪组权限并且我们应该
    构建系统以便它优雅地处理由于调用链中缺少一个权限而导致的失败是错误的(可能使用 Sagas 和补偿
    程序)?

任何评论或资源链接将不胜感激。谢谢!

4

1 回答 1

0

每个服务都应该拥有自己的权限模式,但我建议您使用服务网格不要在每个跃点/微服务中对用户进行身份验证。

于 2018-10-10T13:45:55.043 回答