Laravel API 通过 Vapor 部署时的限制问题

Laravel API throttle issue when deployed via Vapor

我已经在 Vapor 上部署了一个 Laravel 应用程序,前端在 Vue 上(基本上是一个通过 Laravel Sanctum 进行身份验证的 SPA)。详情如下:

Laravel版本:7.11.0 PHP版本:7.4 数据库驱动程序和版本:MySQL 5.8

Laravel 默认 API 节流行为非常奇怪,因为它在未登录时抛出 "Too Many Requests" 错误。

我在 Github here 上添加了 Taylor 关闭的问题,指出针对未登录用户的限制是基于 IP 工作的。这很好,直到我在使用该站点的网络中收到 none 错误,所以它不可能拥有相同的 IP,因此不应该抛出 "Too Many Requests" 错误。

所以我深入研究了代码并发现:

protected function resolveRequestSignature($request)
{
    if ($user = $request->user()) {
        return sha1($user->getAuthIdentifier());
    }
    if ($route = $request->route()) {
        return sha1($route->getDomain().'|'.$request->ip());
    }
    throw new RuntimeException('Unable to generate the request signature. Route unavailable.');
}

以上代码用于根据域和IP解析签名。

为了调试,我将域和 IP 的日志放在我的本地机器上:

在实际的 EC2 实例上显示如下:

到目前为止还不错,但是当我在 Vapor 上登录时,它产生了以下内容:

这清楚地表明:域和 IP 均为空,因此所有未登录用户的签名可能相同。

这里有其他人遇到过吗?如果是,出路是什么?我应该实现自己的油门中间件吗?然后问题又是通过 Vapor 部署时的 IP 为空。

我在 Github 上将此作为问题发布,但它已关闭,并且没有回复我的进一步评论。

对于遇到问题后发现它的任何人:在使用 Vapor 时不要使用 Laravel 的默认中间件进行节流。

我们的网站宕机 5 分钟后(一个流量大的项目),我们很费力地想通了。

问题?

Laravel 在 Symphony 上使用包装器来获取用户的 IP。但似乎由于 Vapor 的设计,它覆盖了它,因此只输出 127.0.0.1 作为所有用户的 IP,这反过来使得所有非 logged-in 用户的默认油门使用的签名相同。

解决方法

使用 x-vapor-source-ip header 来识别 this answer 中提到的用户 IP。

Vapor 的文档中没有提到它,所以邮寄给 Vapor 的团队来修复它。