【问题标题】:Microservice Authentication/Authorisation architecture微服务认证/授权架构
【发布时间】:2019-06-26 19:08:42
【问题描述】:
ARCHITECTURE
需要知道如何为给定架构中的每个微服务授权用户。 IE。如果没有授权根据主数据库中的用户数据拥有该模块,则拒绝对每个微服务的请求。
我还需要在每个微服务数据库之间共享主数据库中的用户以保持数据完整性。
有没有办法做到这一点?还是我需要在每个微服务中重新创建一个用户表?基本上意味着每次用户想要访问微服务时,我都必须在微服务中创建一个新用户(来自主 api 的 POST)(在丢失数据完整性的情况下)。
我还没有尝试过任何寻找建议/可靠且安全的架构的方法。每个微服务都将托管在同一 PAAS 上的子域上,以避免传输攻击并减少延迟。
【问题讨论】:
标签:
database
reactjs
architecture
microservices
【解决方案1】:
如果没有授权根据主数据库中的用户数据拥有该模块,则拒绝对每个微服务的请求。
假设您使用 OAuth2.0 和 JWT 访问和刷新令牌,您可以使用 JWT 令牌的“aud”声明来携带访问各个微服务的授权或权利或权限。在“aud”声明中,您可以提供用户有权访问的单个服务 URL 或服务 ID。在单个微服务(或 OAuth 术语中的资源服务器)中,您需要检查 JWT 是否在其“aud”声明中携带特定的微服务 UR 或 id。否则,访问将被拒绝。
我还需要在每个微服务数据库之间共享主数据库中的用户以保持数据完整性。
这通常不是这样做的。
您通常有一个授权服务器。那是所有用户信息的主人。任何试图访问任何服务的未经身份验证的用户都将被重定向到授权服务器,并在验证自己后被要求提供他们的授权。完成身份验证并获得授权后,用户将被重定向到具有适当访问权限和刷新令牌的服务页面,随后将伴随所有用户请求。即使请求来自User A -> Service B -> Service C。然后服务 B 和 C 需要检查:
- JWT 是否有效(未被任何人篡改)? (使用 JWT 中的数字签名 - 通常是 HMACSHA256)
- 根据授权服务器在 JWT 的“exp”声明中设置的到期日期和时间,访问令牌(通常是 JWT)是否仍然有效?
- “aud”声明中是否存在服务 URL 或 ID?
如果所有 3 个问题都回答为“是”,则授予访问权限,并且每个服务都可以从 JWT 的“sub”声明中找到用户名。用户名可以被记录以供审计
我还建议您阅读this answer。