0

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

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

Laravel 默认 API 限制的行为非常奇怪,因为它在未登录时会抛出“Too Many Requests”错误。

我在 Github 上添加了这个问题 Taylor 关闭了该问题,指出节流是基于 IP 对未登录用户起作用的。这很好,直到当我收到使用该站点的网络中没有的错误时,它不可能拥有相同的 IP,因此不应该抛出“请求过多”错误。

所以我潜入代码并发现:

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 上,但它已关闭,并且没有回复我的进一步评论。

4

1 回答 1

0

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

在我们的网站宕机 5 分钟(一个交通繁忙的项目)后,我们很难理解。

问题?

Laravel 使用 Symphony 的包装器来获取用户的 IP。但似乎由于 Vapor 的设计,它覆盖了这一点,因此只输出 127.0.0.1 作为所有用户的 IP,这反过来又使默认油门使用的签名对所有未登录的用户都相同。

解决方案

使用标头标识此答案x-vapor-source-ip中提到的用户 IP 。

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

于 2020-06-09T08:28:40.530 回答