Laravel 速率限制 API 使用 API 令牌进行身份验证

Laravel rate limiting API authenticated with API Token

我正在为我的 Laravel 应用程序的用户构建一个 restful API 来检索他们的数据。

目前的计划是,他们可以在应用程序中生成一个 API 令牌,然后验证他们的 API 请求。我不知道他们会从哪里提出要求。

我想实施限速的主要原因是为了减少accidental/intentionalDDOS的影响,以及部分用户当前的订阅包(必要)。因为后者,不同的用户可能会有不同的费率。

Laravel 已经提供了内置的速率限制器,包括访问用户 table.

中指定的动态用户限制

我想知道会话是如何处理的。据我所知,Laravel TokenGuard class 不会在请求之间存储用户。因此,在每个请求之间检索用户,甚至检索速率限制。如果我们每次仍在进行数据库查询,这似乎会破坏速率限制器的意义。

处理这个问题的合适方法是什么?

如果我编写自己的身份验证中间件,并将用户存储在会话中,这样行得通吗?从另一台服务器(不是浏览器)发送的请求是否处理会话?

谢谢。

每次有人访问您的站点时,您都​​在启动一个完整的 Laravel 实例,这已经给您的服务器带来了压力。 DDOS 不仅仅依赖于破坏您的数据库。如果有人决心对你进行 DDOS,你会注意到的!您所能做的就是缓解问题,因此不必担心每个请求都有关联的数据库调用。

您可以有一个本地会话,但从长远来看 运行 这是一个糟糕的设计决策,因为它将状态引入您的服务器,这将使将来的扩展变得更加困难。 (https://12factor.net/ 了解更多信息。)这就是 Laravel 使用存储在数据库中的用户的原因。

除非您正在做一些非常特别的事情,否则通常可以安全地假设 Laravel 正在使用适当的解决方案。他们做框架,让你不用操心业务逻辑!

最后,有很多网站。很有可能的是,当你足够大以吸引试图对你进行 DDOS 攻击的人的注意力时(记住这需要资源,因此,也需要金钱)你可能会使用一个更复杂的系统。

如果带有某种令牌的请求到达您的应用程序,则您不需要任何类型的会话。正如您假设的那样:会话通常通过 cookie 处理,但原始 HTTP 调用(如 cURL 所做的)通常不使用它们。

不要高估从数据库中获取当前用户的成本 - 如果您的应用程序执行更多操作,这些额外的操作将会有所作为!从数据库中获取一个实体是相当便宜的,与其他一切相比,并检查适当的权限和速率限制,这显然是必要的。

其他一切看起来像您正在寻找类似 Laravel Passport(请参阅 https://laravel.com/docs/5.7/passport). Additional tools like the Throttle package (see https://github.com/GrahamCampbell/Laravel-Throttle)的东西将帮助您启用路由的速率限制