如何在不同时间点对 3 种不同服务进行哈希处理时同步用户密码?

How to sync user password between 3 different services when they are hashed in different point of time?

我有 3 个保存特定用户信息的微服务,包括他们的登录凭据(电子邮件 + 密码)。如果服务是 ABC,则用户“John”的信息将分别存储在所有这三个服务的数据库中。

现在服务A中的用户信息是在较早的时间点更新的,此时无法预测服务BC是否肯定会更新激活以供该特定用户使用。因此,在 BC 中为“John”创建一个条目是没有意义的。但是,由于“John”稍后激活 BC,系统只能访问散列密码。

需要注意的是,服务C要求密码以加密形式存储,以便日后解密。因此,仅将哈希值存储在所有 3 个服务中是不可行的,我们也不希望所有 3 个服务都有加密密码。

有什么可行的方案,通过维护需求在服务之间同步密码?

除了您自己已经描述的问题之外,您的方法还包含很多问题。我建议查看适合微服务架构的联合身份(使用 OAuth2 和 OpenID Connect)。

基本上,这意味着身份验证和凭据处理由单独的高度可用和可扩展的服务(通常称为身份提供者或授权服务器)执行,该服务仅负责处理用户凭据、身份和访问控制,以及做得好

它处理登录并发出访问令牌,然后将访问令牌与请求一起发送到您的微服务。由于每个微服务都将信任这个身份提供者,它将能够验证令牌是否有效并且是由这个身份提供者颁发的(这是通过使用 public 密钥验证令牌来实现的)。令牌包含用户 ID 等信息以及有关此令牌允许执行的操作的信息。

身份提供者可以是 Okta、Auth0、Azure AD B2C 等云服务(参见 https://openid.net/developers/certified/#OPServices) or host an identity provider on your own, if you are not able to access cloud services, by using ready-to-use libraries available for your technology stack (https://openid.net/developers/certified/#OPLibs)。

因此无需在每个微服务中存储用户凭据并在它们之间同步此信息。我会将这种方法视为反模式。

联合身份验证方法还可以解决其他问题,例如单点登录。

如果您是该主题的新手,一开始可能会有点不知所措,但如果您真的想拥有微服务架构可以提供的所有优势,就无法绕过它。

本文可能会帮助您入门: https://nordicapis.com/how-to-control-user-identity-within-microservices/