问题描述
我遇到了与 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。 AppServiceProvider
或 AuthServiceProvider
:
public function boot()
{
RateLimiter::for("login",function () {
Limit::perMinute(5);
});
}
编辑:
我刚刚意识到“登录”键的速率限制器确实由 FortifyServiceProvider
类中的 Fortify 提供。如果您碰巧遇到与上述问题类似的问题,请确保将 FortifyServiceProvider
类添加到 providers
中的 config/app.php
数组。