Laravel

Laravel API のアクセス制限数を調整する

みなさん、こんにちは。どんぶラッコです。

本日は Laravel で api.php を使っているときのアクセス制限をコントロールする方法について書いていきます。

api.php って何?

そもそも api.php を使ったことがないよ…?という方もいるかもしれません。

api.php を使ったことがない方も、web.php は使ったことがあると思います。

/route ディレクトリ内部にある、ルーティングの処理を行ってくれる場所です。

その /route ディレクトリの中に api.php も存在します。

やってくれることは web.php 同様にルーティングの処理なのですが、prefix (デフォルトでは /api ) をつける形で API用のルーティング処理を実施してくれます。

RouteServiceProvider を確認する

では、ここら辺の設定はどこにあるのか?というと RouteServiceProvider.php に定義があります。

/app/Providers/RouteServiceProvider.php

class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/dashboard';

    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }

    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(100);
        });
    }
}

ここで Route の設定が書いてあるわけです。

注目していただきたいのは RateLimiter の部分です。

    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(100);
        });
    }

ここで api.php へのアクセス回数を制限しているわけです。この場合、 1分あたり、100回までの制限がかかっている状態です。

この数字を変更すれば、1分間あたりの回数制限を引き上げることができます!

なぜ回数制限がかかっているの?

ではなぜ回数制限がかかっているのかというと、この /api.php で定義されているAPIは外部に払い出す用のAPIルートを想定しているからだと思われます。

もし、自分のサービスのフロントから呼び出すAPI、外部に払い出すAPIを分けたい場合は、routeを増やしてあげることができます。

    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            // こんな感じで追加できる
            Route::prefix('api2')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api2.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));
        });
    }

みなさんもチャレンジしてみましょう!

ABOUT ME
どんぶラッコ
ECコンサルタント、システムエンジニアを経て、quintet株式会社CTOに就任。普段はNuxt.jsやLaravelを使用しています。

\面白いと思ったら/

記事のシェア & Twitter のフォロー をお願いします!

@proglearn
RELATED POST

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です