为用户和API分离身份验证服务器

Dar*_*der 7 security authentication api

我正在研究云服务身份验证系统,我不完全确定处理身份验证请求的最佳方式是什么.我们计划将我们的图像服务器作为与API服务器分开的进程运行,以便我们可以相互独立地扩展它们.使用API​​密钥处理请求身份验证非常简单,因为我们可以让映像服务器存储自己的API密钥并检查请求是否在标头中提供(显然通过HTTPS),与API服务器相同.对于用户而言,它变得更加复杂.

现在我们设置它以便API服务器处理生成会话令牌并将用户存储在其数据库中,但我们想要做的是使用3台服务器:

  • 验证服务器
  • API服务器
  • 图像服务器

并让映像和API服务器对身份验证服务器的请求进行身份验证.究竟应该怎么做呢?对于API和映像服务器发出的每个请求,都要在性能方面达到性能.可以/应该从与其创建的服务器不同的服务器验证令牌吗?

例如:可以/我应该将从验证服务器收到的令牌传递给映像服务器,验证令牌来自"my.auth.server"并检查用户ID是否正确?JWT会是一个很好的代币吗?

Joe*_*Joe 13

这是另一种方法。

您的身份验证会发出一个 JWT 令牌,该令牌使用您的 API 和服务器映像中也提供的密钥进行签名。它们也需要在那里的原因是您需要验证收到的令牌以确保您创建了它们。JWT 的好处是,如果不同的用户具有不同的访问控制级别,它们的有效负载可以声明用户有权访问的内容。

该架构使身份验证无状态:不需要在数据库中存储任何令牌,除非您想处理令牌黑名单(想想禁止用户)。如果您需要扩展,无国籍至关重要。这还使您的 API 和图像服务器不必调用身份验证服务器,因为它们身份验证和授权所需的所有信息都在颁发的令牌中。

流程(无刷新令牌):

  1. 用户通过身份验证服务器进行身份验证(例如:POST /auth/login)并接收由身份验证服务器生成和签名的 JWT 令牌。
  2. 用户使用该令牌与您的 API 和图像服务器对话(假设用户已获得授权),获取并发布必要的资源。

这里有几个问题。也就是说,如果身份验证令牌落入坏人之手,恶意用户就可以无限制地访问该用户,以假装自己是受影响的用户并无限期地调用您的 API。为了解决这个问题,令牌有一个到期日期,并且每当到期时客户端都被迫请求新的令牌。该过期时间是令牌有效负载的一部分。但如果令牌是短暂的,我们是否要求用户每次都使用他们的用户名和密码进行身份验证?不。我们不想每隔 30 分钟到一个小时询问用户密码,也不希望在客户端的任何地方保留该密码。为了解决这个问题,我们引入了刷新令牌的概念。它们是寿命较长的令牌,仅用于一个目的:充当用户的密码,对它们进行身份验证以获得新令牌。缺点是,使用这种架构,您的身份验证服务器需要将这些刷新令牌保留在数据库中,以使它们在过期之前可撤销(想想令牌表中的“已撤销”列)。

新流程(带有刷新令牌):

  1. 用户通过身份验证服务器进行身份验证(例如:POST /auth/login),并接收由身份验证服务器生成和签名的 JWT 令牌,以及安全存储的长期(例如:6 个月)刷新令牌
  2. 每当用户需要发出 API 请求时,都会检查令牌的到期时间。假设它尚未过期,用户使用该令牌与您的 API 和图像服务器对话并假设用户已获得授权),获取并发布必要的资源。
  3. 如果令牌确实已过期,则需要刷新令牌,用户调用身份验证服务器(例如:POST / auth/token)并传递安全存储的刷新令牌。响应是颁发的新访问令牌。
  4. 使用该新令牌与您的 API 图像服务器对话。

可选(禁止用户)

我们如何禁止用户?使用该模型没有简单的方法可以做到这一点。增强功能:每个持久刷新令牌都包含一个列入黑名单的字段,并且仅在刷新令牌未列入黑名单时才颁发新令牌。

需要考虑的事项:

  • 您可能想要轮换刷新令牌。为此,每次用户需要新的访问令牌时,请将刷新令牌列入黑名单。这样刷新令牌只能使用一次。缺点是您最终会得到更多的刷新令牌,但这可以通过清除黑名单刷新令牌的作业轻松解决(例如:每天一次)
  • 您可能需要考虑设置每个用户允许颁发的刷新令牌的最大数量(例如 10 或 20),因为您每次登录(使用用户名和密码)时都会颁发新的令牌。该数字取决于您的流量、用户可能使用的客户端数量(网络、移动设备等)以及其他因素。
  • 您可以与刷新令牌一起存储一些附加元数据(ip、地理位置、设备、浏览器 cookie 等)。这样,您就可以明智地决定何时拒绝刷新令牌的恶意使用,以防其受到损害。
  • 常见问题:为什么要存储所有刷新令牌,而不仅仅是撤销的令牌?你可以这么做。问问自己以下问题:我是否在任何时候都需要一种功能,可以根据某些任意的、监管的、法律的、完整性的、安全性等标准动态撤销有效的刷新令牌?如果是这样,您至少需要的是所有已发行代币的列表,以及实现标准逻辑所需的任何数据。示例:由于监管规定,我需要禁止所有欧盟用户,这相当于delete from refresh_tokens were user_ip in <... eu logic ...>


Aym*_*med 0

最好的使用方法之一是 JWT 令牌,您可以在所有服务器之间生成和共享它,并在服务器端验证它。

https://jwt.io

我也认为在这种情况下使用的最佳架构是微服务架构