在微服务架构中组织用户和身份验证

Posted

技术标签:

【中文标题】在微服务架构中组织用户和身份验证【英文标题】:Organize user and authentication in microservice architecture 【发布时间】:2020-03-13 18:35:43 【问题描述】:

在我们的微服务中,我们将拥有自定义身份验证/授权服务,也就是 UAA,对吗?让用户控制器用于登录、令牌验证或创建用户是有意义的。

但还有第二个用例。我们还希望有一些用户管理,用于向用户添加收藏夹联系人,用一些附加信息填充个人资料,用户地址等。在第二个用例中,我希望为此目的提供第二个微服务。您有什么建议或最佳做法是什么?

    拥有一个用于用户管理的微服务,例如他的个人资料、联系人、凭据以及登录/令牌提供

    有两个微服务 - 一个用于管理用户凭据、提供令牌 (uaa),第二个用于用户附加信息

    有两个微服务 - 一个用于完全分离的用户管理,第二个用于身份验证、令牌提供,如果需要一些用户数据或验证用户凭据,将使用用户服务的 rest api

对我来说是 3. 选项很好,但我想听听你的意见。

【问题讨论】:

【参考方案1】:

这三个都是有效的方法。如果应用程序具有简单的用户管理,则最好使用第一种方法。如果应用程序具有其他复杂的用户功能,则最好使用第三种方法。 我的观点在第三种方法实现中略有不同。凭据和用户配置文件应像任何标准 OAuth2 授权服务器一样在身份验证服务中维护。 一旦用户在身份验证服务器上完成注册,他/她的个人资料应该被复制到用户服务中。这种复制应该是异步的。 额外的配置文件完成应在用户服务中完成。 对于身份验证/授权,应将 Oauth2 授权与 JWT 一起使用。

【讨论】:

【参考方案2】:

我的建议是有两个微服务:

    用于用户管理,例如他的个人资料、联系人、凭据。在此微服务上,用户将创建帐户、发送重置密码等。

    一个用于授权(例如:带有 JWT 令牌的 Oauth2)。此微服务将仅用于授权(在 ouath2 和 JWT 的情况下,用于根据用户名/邮件和密码生成 JWT 令牌)。

当用户创建帐户时,将向授权微服务发出带有用户凭据和权限的请求,以通知新用户已创建。用户重置密码或删除用户也是如此。

授权微服务将接收该请求并将用户凭据和权限保存在自己的数据库中,例如 Redis 或 PosgreSQL。每个将登录您的服务/应用程序的用户都将首先调用授权微服务,将收到一个包含用户元数据(名称、角色和其他信息)的 jwt 令牌,并使用该令牌将请求发送到您的应用程序/服务的其他微服务,例如用于用户管理、订单服务或其他。

【讨论】:

【参考方案3】:

在微服务世界中,使用单独的身份验证服务进行身份验证并不是一个好方法。因为如果身份验证服务关闭,您将如何对用户进行身份验证。你的整个应用都会崩溃。

选择选项 1。让用户服务也处理身份验证。想象一下,你构建了许多微服务,每个服务都应该对用户本身进行身份验证,而不依赖于其他服务。

【讨论】:

如果您避免引入用户微服务并让每个服务直接使用相应的端点处理整个 AuthN + AuthZ,那么您可以从可用性方程中消除用户微服务的所有停机时间。但无论哪种方式,您的 AuthN (IdP) 和 AuthZ 服务器端点仍然是单点故障。

以上是关于在微服务架构中组织用户和身份验证的主要内容,如果未能解决你的问题,请参考以下文章

如何在微服务架构中进行身份验证和授权

微服务架构的身份验证解决方案

如何在微服务和 API 网关架构中对不同的配置文件进行身份验证和授权

在微服务架构的每个服务中验证访问令牌 (JWT)

如何在微服务和API网关架构中对不同的配置文件进行身份验证和授权

如何在微服务架构中使用 3rd 方 IDP 实现 OpenID Connect 身份验证