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 的团队来修复它。
我已经在 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 的团队来修复它。