我们的系统正在从单体架构转向微服务架构。微服务架构带来了我们需要解决的技术挑战,其中之一是 AuthN/AuthZ。
我们的方法是拥有一个身份验证服务,可以对用户进行身份验证并生成访问/刷新令牌 (JWT)。然后,访问令牌将通过微服务链在请求标头中传递,这样每个微服务只需验证令牌即可确定用户已成功通过身份验证。对于 AuthZ 部分,权限强制是在微服务本身中完成的。我的问题与 AuthZ 有关。
为了说明这个谈话,让我们举一个具体的例子,一个接待员想要注册一个新成员到他的保真计划,例如从一个 Web 应用程序。为了支持这个用例,我们假设系统有 2 个微服务,ReceptionService 和 MemberService。ReceptionService 提供了一个 REST API 来启动会员注册流程。它需要用户权限“注册”才能执行。MemberService 提供一个 REST API 来创建受 CRUD 权限保护的新成员资源。请求流将是:
为了针对这种情况设计解决方案,我的团队研究了以下假设/先决条件:
为了能够完成上述示例,需要为用户分配 2 种不同的权限,这打破了我们的一些假设/先决条件。为了克服这个问题,我的一位同事提议考虑在我们的 AuthN 系统中将微服务声明为身份/用户,以便为它们分配适当的权限。最初提供的用户令牌随后将被调用链中的参与服务令牌替换。回到这个例子,新的请求流将是:
用户先前登录的 Web 应用程序将成员注册请求发送到 ReceptionService API,在标头中包含用户访问令牌。
ReceptionService 验证用户令牌,确保用户被授予“注册”权限,执行它需要做的任何业务逻辑,最后向 MemberService API 发送一个成员创建请求,在头中包含它自己的服务令牌(因此替换原始用户令牌)。
MemberService 验证服务令牌,确保服务被授予“member.create”权限,最后创建成员。
使用此解决方案,AuthN 系统中的服务身份将通过从管理权限分配的管理员用户中过滤出来的方式进行标记。对服务身份的权限分配将是预先定义的,用户不可能对其进行配置。虽然它满足了我们的假设/先决条件,但我对这种方法几乎没有担忧:
难道我们的一些假设/先决条件是错误的?