为用户提供集中式身份验证服务器或每个微服务一个数据库?

Posted

技术标签:

【中文标题】为用户提供集中式身份验证服务器或每个微服务一个数据库?【英文标题】:Centralized Auth server or One db per microservice for users? 【发布时间】:2020-11-02 01:59:04 【问题描述】:

我正在设计两个微服务,一个是为教师设计的,另一个是为学生设计的。现在我的问题是存储用户和进行身份验证授权的最佳方法是什么:-

    集中式Auth服务器,将存储用户角色以及所有信息。

    集中式Auth服务器,仅存储角色,但用户信息将存储在各自服务(学生、教师)的数据库中

    没有集中式身份验证服务器,而是根据请求正文中的角色将登录请求重定向到学生或教师,这将是网关的责任。

我想知道这些方法的优缺点。如果有更好的方法,请分享。

P.S :- 一个用户可以分配多个角色。

【问题讨论】:

为什么要使用微服务而不是单体? 因为我正在将一个大单体拆分成小的小型微服务。这是对旧应用程序的重新设计。 【参考方案1】:

我会选择第一种方法。与其说是“集中式身份验证”服务器,不如说是一个“身份验证微服务”。

现在重要的部分是如何处理身份验证本身。一般来说,您可以使用会话或 JWT。

对于微服务,我认为 JWT 非常适合。如果您使用会话,则基本上“集中”您的身份验证和授权。我的意思是,在用户通过身份验证后,每次用户发出请求时,响应此响应的所有微服务都必须检查集中式会话。这不仅会增加延迟,而且不适合分布式系统。使用微服务的目的是复制服务并进行横向扩展。

如果你使用 JWT,微服务只需要密钥来验证令牌。基本上没有用于身份验证信息的集中存储(会话)。

关于“身份验证服务”,我建议您只存储身份验证和授权相关数据(包括与身份验证相关的用户信息。电话号码、电子邮件、姓名等。如果用户需要更改密码,您可能会使用它,忘记密码等)。与特定角色相关的其他特定数据可以存储在相应的服务中。

【讨论】:

谢谢。我们如何使分布式系统的 JWT 令牌无效以进行注销?对此有什么想法吗? @ArpanPathak 当客户端注销时,客户端中的访问令牌(本地存储或cookie)被简单地删除。服务器上没有任何改变

以上是关于为用户提供集中式身份验证服务器或每个微服务一个数据库?的主要内容,如果未能解决你的问题,请参考以下文章

如何跨多个微服务提供用户身份?

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

使用 jwt 在微服务中进行身份验证

微服务认证架构

面向服务架构中的集中式身份验证

微服务架构中的 SPA 认证