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

Laravel rate limit throttle for /oauth/token Passport endpoint

我正在尝试为 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 路由禁用它吗?

那是因为 passport 不使用 api 中间件,而是 throttle 一个直接在该路由上的中间件。
您可以在 source code:

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

您可以在 passport 注册他的路线之前自行定义该路线。要做到这一点,我认为最方便的方法是连接到 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();
});

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