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

Rya*_*ski 2 php rate-limiting laravel http-status-code-429

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

'api' => [
    // 'throttle:60,1',
    'bindings',
],
Run Code Online (Sandbox Code Playgroud)

但是,尽管这有效地禁用了我在 api 路由文件中定义的每个端点的速率限制,但它并没有这样做/oauth/token,就好像 Passport 有默认的节流设置一样。所以我只是AppServiceProvider用一个荒谬的数字添加了该路由的油门中间件:

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

但是当我测试这个时,由于某种原因,在几次请求后我仍然收到 429 错误:

429 Too Many Requests

X-RateLimit-Limit ?9999999999
X-RateLimit-Remaining ?9999999935
x-ratelimit-reset ?1567108098
Run Code Online (Sandbox Code Playgroud)

所以我宁愿完全禁用它。任何想法如何专门为 Passport 路线禁用它?

mde*_*exp 5

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

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

在护照注册他的路线之前,您可以覆盖自己定义的路线。要做到这一点,我认为最方便的方法是连接到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();
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 谢谢,这可行,但是 $router->forAccessTokens(); 或 $router->all(); 应该在 Route::post('/token'.. 之前去覆盖路由。我的 laravel 是 v6.13.1。 (2认同)