2

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

4

1 回答 1

5

那是因为护照不使用api中间件,而是throttle直接在那条路线上使用的。
您可以在源代码中看到:

// 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您可以通过在项目根目录的控制台窗口中执行来检查路由是否已正确注册

于 2019-08-30T00:08:26.780 回答