Регулировка ограничения скорости Laravel для конечной точки /oauth/token Passport

Я пытаюсь отключить ограничение скорости для встроенной конечной точки Passport oauth/token в Laravel 5.8, и я решил, что просто удаление промежуточного программного обеспечения дроссельной заслонки из 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?


person Ryan Bobrowski    schedule 29.08.2019    source источник
comment
Разве Passport::routes(); не должно быть в методе загрузки AuthServiceProvider?   -  person Salim Djerbouh    schedule 30.08.2019


Ответы (1)


Это связано с тем, что в паспорте используется не 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 в окнах консоли из корня вашего проекта.

person mdexp    schedule 30.08.2019
comment
Спасибо, это работает, но $router-›forAccessTokens(); или $router-›all(); должен идти перед Route::post('/token'.. чтобы переопределить маршрут. Мой laravel - v6.13.1. - person user570605; 16.03.2020