/ oauth / token Passport端点的Laravel速率限制节流阀

时间:2019-08-29 19:53:29

标签: php laravel rate-limiting http-status-code-429

我试图在Laravel 5.8中禁用Passport内置oauth/token端点的速率限制,我发现只需从api中删除节流中间件就可以做到:

'api' => [
    // 'throttle:60,1',
    'bindings',
],

但是,尽管这有效地禁用了我在我的api路由文件中定义的每个端点的速率限制,但对于/oauth/token却没有这样做,就像Passport具有默认的限制设置一样。因此,我刚刚在AppServiceProvider中为该路线添加了油门中间件,并加上了一个荒谬的数字:

\Route::group(['middleware' => ['custom_provider', 'throttle:999999999,1']], function () {
    Passport::routes();
});

但是,当我对此进行测试时,由于某些原因,在经过几次请求后仍然出现429个错误:

429 Too Many Requests

X-RateLimit-Limit →9999999999
X-RateLimit-Remaining →9999999935
x-ratelimit-reset →1567108098

所以我宁愿完全禁用它。有什么想法如何专门针对Passport路由禁用它吗?

1 个答案:

答案 0 :(得分:1)

这是因为护照不使用api中间件,而是直接在该路由上使用throttle一个中间件。
您可以在source code中看到它:

// This is how passport register that route
$this->router->post('/token', [
    'uses' => 'AccessTokenController@issueToken',
    'as' => 'passport.token',
    'middleware' => 'throttle',
]);

您可以在护照注册他的路线之前覆盖该路线并自行定义。为此,我认为最方便的方法是使用Passport::routes()方法:

Passport::routes(function ($router) {
    $router->forAuthorization();

    Route::post('/token', [
        'uses' => 'AccessTokenController@issueToken',
        'as' => 'passport.token',
    ]);
    // This function would trigger the internal /token route registration
    $router->forAccessTokens();

    $router->forTransientTokens();
    $router->forClients();
    $router->forPersonalAccessTokens();
});

请注意,如果您需要所有护照路线,也可以这样做:

Passport::routes(function ($router) {
    Route::post('/token', [
        'uses' => 'AccessTokenController@issueToken',
        'as' => 'passport.token',
    ]);
    $router->all();
});

您可以通过从项目根目录在控制台窗口中执行php artisan route:list来检查路由是否已正确注册