狛ログ

2021年12月28日火曜日

【Laravel】条件によって、RateLimitterの回数制限のカウント処理を分ける方法。


オフィス狛 技術部のmmm(むー)です。

LaravelでAPIのリクエストをある回数以上行うと、「Too Many Attempts」のエラーが発生して一定時間経過するまでAPIを実行できなくなります。
このエラー文言の表示条件は、RateLimiterにて設定されています。
条件によって、この制限回数のカウント方法を変更する修正がしたかったのですが、対応方法がなかなか見つけられず時間がかかったため記事に残します。

やりたいこと
・ユーザー情報を取得できた場合:1分間に5回連続でAPIをリクエストすると、「Too Many Attempts」のエラーを発生させる
・ユーザー情報を取得できない場合:1時間に10回連続でAPIをリクエストすると、「Too Many Attempts」のエラーを発生させる

Laravelバージョン
$ php artisan --version
Laravel Framework 8.27.0

対処方法

早速ですが、下記のように記載すると実現できました。
RateLimiter::for('login', function (Request $request) {
	return $request->user()
	  ? Limit::perMinute(5)->by($request->user()->id) // ユーザー情報を取得できた場合のリクエスト回数制限
	  : Limit::perHour(10)->by($request->email.$request->ip()); // ユーザー情報を取得できない場合のリクエスト回数制限
}

・制限回数のチェックをする際は、by()でどの単位でカウントするかを指定します。
   ・ユーザー情報を取得できた場合:ユーザーID単位($request->user()->id)でカウント
   ・ユーザー情報を取得できない場合:リクエストのメールアドレス+IPアドレス($request->email.$request->ip())でカウント
・1分間での回数制限を設定する場合は、perMinute()を使用します。
・1時間での回数制限を設定する場合は、perHour()を使用します。

参考:https://laravel.com/docs/8.x/routing#segmenting-rate-limits (公式)

その他
確認する際は、キャッシュをクリアしてください。
$ php artisan cache:clear

またRateLimiterの修正が反映されているか、レスポンスヘッダーから確認することができます。
・X-RateLimit-Limit:全何回リクエストできるか
・X-RateLimit-Remaining:あと何回リクエストできるか
・Retry-After:何秒後にロックが解除されるか


以上となります、参考になりましたら幸いです。

,

0 件のコメント:

コメントを投稿