Laravel 8 Fortify 登录显示 429 TOO MANY REQUESTS

问题描述

我遇到了与 429 TOO MANY REQUESTS 相关的问题。我使用过 Laravel fortify,我的网络路线就像

Route::get('/',function () {
    return view('welcome');
});

Route::get('/dashboard','DashboardController@dashboardView')
    ->name('dashboard')->middleware('auth');

问题是间歇性出现的,成功登录后,如果我立即退出并立即尝试登录,我将重定向到仪表板,它给出了 429 TOO MANY REQUESTS,并且在地址栏中,URL 为 http://127.0.0.1:8000/login。现在,如果我在那里等待一秒钟并刷新页面,它会重定向到仪表板页面

我在网上搜索过,每个人都在谈论节流阀,但我不认为这是解决方案。请帮我。 谢谢。

解决方法

我今天偶然发现了同样的问题并进行了一些调试。在注册 /login 路由时,Fortify 对其应用 Illuminate\Routing\Middleware\ThrottleRequests:login 中间件。这意味着,对于对该路由的每个请求,ThrottleRequests 中间件将调用该指定键的 RateLimiter 实例。显然,Fortify 没有为 RateLimiter 键注册 login

由于 $limiters 实例的 RateLimiter 属性中缺少键,ThrottleRequests 中间件使用其默认后备,它不处理边缘情况“应该有一个该密钥的速率限制器,但没有。”真的很好。 $maxAttempts 变量设置为 0,将导致不稳定的速率限制行为。

我觉得这是 Fortify 中的一个错误,因为在 \Laravel\Fortify\Actions\EnsureLoginIsNotThrottled 操作中也发生了速率限制,该操作在 \Laravel\Fortify\Http\Controllers\AuthenticatedSessionController 控制器中调用。不过,我没有在新安装的 Laravel 上检查这个,所以我不想在这里下结论。

无论如何,长话短说:作为一种解决方法,您可以简单地在某些提供商中为“登录”键注册一个速率限制器,例如。 G。 AppServiceProviderAuthServiceProvider

public function boot()
{
    RateLimiter::for("login",function () {
        Limit::perMinute(5);
    });
}

编辑: 我刚刚意识到“登录”键的速率限制器确实由 FortifyServiceProvider 类中的 Fortify 提供。如果您碰巧遇到与上述问题类似的问题,请确保将 FortifyServiceProvider 类添加到 providers 中的 config/app.php 数组。