如何使用微服务处理身份验证
#node #microservices #backend #authentication

使用微服务以及更普遍的分布式系统,带来了许多新的挑战。其中之一是如何处理身份验证

如果您不确定微服务的确切属性以及随之而来的挑战,请随时更深入地阅读它:

Understand the Difference Between Monolith, MicroServices, and Distributed Monolith

验证您对现代软件体系结构的了解

favicon blog.scaleablebackend.com

身份验证和授权

实际上,身份验证不是我们必须管理的唯一步骤,而是授权

如果您不确定差异,Auth0提醒我们:

简单地说,身份验证是验证用户是谁的过程,而授权是验证他们有权访问的内容的过程。

实际上,您可以看到身份验证是发送电子邮件和密码的过程。您通常会检索将您标识为用户的内容,您将与其他请求一起发送。

这样,在其他所有请求下,服务器都知道您是谁以及您可以访问哪些资源。然后,他可以决定是否可以访问某些端点,这是授权

现在,我想将身份验证系统区分为两组,面临不同的挑战。它们是状态无状态身份验证系统。

状态身份验证

在一个状态身份验证系统中,您每次提出请求时都需要检索用户信息。

例如,在身份验证后,您可以检索将您与数据库中用户联系起来的唯一ID。这样,服务器可以找到您的身份,而无需每次发送电子邮件和密码。

Stateful authentication

但是,服务器仍然需要验证与您发送的唯一ID相关的用户信息。只有这样他才能决定您是否可以访问给定的资源。

这意味着,即使您发送了标识您的唯一ID,服务器也必须在处理请求之前检索用户信息。

Stateful authorization

在微服务方面,此授权步骤变得有问题。如果您做得很好,则要避免使用高耦合,这意味着两件事(包括):

  • 独立数据库

  • 服务之间没有同步通信(请求/响应)。

这意味着,使用当前状态,我们无法授权用户在专用于身份验证的服务之外的服务上。

Stateful authorization - cannot access

现在,我们必须考虑一种使授权成为可能的方法,但保持微服务独立且低耦合。

有一个主要解决方案:通过API网关管理身份验证。

Authentication through API gateway

在这里,我们使用的是一个API网关,其角色是代理请求正确的服务。但是,在代理请求之前,它检查了用户是否发送了他要使用的ID。

如果他这样做,API网关会检索与用户相关的数据,并在发送到正确的服务之前将其添加到请求中。

例如,它在字符串中编码用户信息,并通过标头传递。

以这种方式,任何服务都可以解码用户信息,而无需依赖用户服务。

我认为,在微服务方面,状态身份验证根本不是一个很好的身份验证系统。

它使开发和维护更加艰难,对性能产生了严重的影响,并为安全漏洞打开了大门。

虽然可以使用先前的解决方案,但我更喜欢使用无状态身份验证系统。

无状态身份验证

在无状态身份验证系统中,用户信息由客户端存储。这意味着,一旦经过身份验证,就无需检索用户信息。

例如,可以使用JSON Web令牌设置无状态身份验证系统。

https://blog.scalablebackend.com/vulnerabilities-in-authentication-with-jwt

在这里,该过程变得更加简单。我们通过对用户服务进行认证并将其发送请求发送给其他服务来生成JWT。

Stateless authentication & authorization

其他服务不需要在用户信息独立时达到用户服务。

它通过设计使一切变得简单,并有助于使我们的服务完全独立。

虽然这是我的看法,但它绝对是我最喜欢使用微服务来处理身份验证的方法。


您是否正在寻找更深入的和实用的微服务课程?好消息,我在完整指南中教微服务

Enterprise Grade Back-End Development with NodeJS

了解如何使用node.js&编写可靠的后端应用程序。 Nestjs!

favicon 可伸缩式网站

Max Harlynking上的封面照片Unsplash