みなさん、こんにちは。どんぶラッコです。
本日は 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'));
});
}
みなさんもチャレンジしてみましょう!