4.1 KiB
Обмеження частоти запитів
Для того, щоб уникнути зловживань, вам слід подумати про додавання обмеження частоти запитів до вашого API. Наприклад, ви можете обмежити використання API 100 запитів API протягом 10 хвилин для кожного користувача. Якщо від користувача протягом цього періода часу приходить більша кількість запитів, буде повернена відповідь з кодом 429 («занадто багато запитів»).
Для того щоб увімкнути обмеження частоти запитів, yii\web\User::identityClass повинен реалізовувати інтерфейс yii\filters\RateLimitInterface. Цей інтерфейс вимагає реалізації наступних трьох методів:
getRateLimit()
: Повертає максимальну кількість дозволених запитів та період часу, наприклад[100, 600]
, що означає не більше 100 викликів API прогятом 600 секунд.loadAllowance()
: Повертає залишену кількість запитів та UNIX-timestamp останньої перевірки обмеження.saveAllowance()
: Зберігає залишену кількість дозволених запитів та поточний UNIX-timestamp.
Ви можете використовувати два стовпці в таблиці user для зберігання кількості дозволених запитів та час останньої перевірки.
У методах loadAllowance()
та saveAllowance()
можна реалізувати читання та зберігання значень цих стовбців відповідно
до даних поточного аутентифікованого колистувача. Для поліпшення продуктивності можна спробувати зберігати цю
інформацію в кеші чи NoSQL сховищі.
Як тільки відповідний інтерфейс буде реалізований у класі identity, Yii почне автоматично перевіряти обмеження частоти запитів за допомогою yii\filters\RateLimiter, фільтра дій для yii\rest\Controller. При перевищенні обмежень буде викинутий винятокyii\web\TooManyRequestsHttpException.
Ви можете налаштувати обмеження частоти викликів у ваших класах REST-контролерів наступним чином:
public function behaviors()
{
$behaviors = parent::behaviors();
$behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
return $behaviors;
}
При включеному обмеженню частоти запитів кожну відповідь, типово, повертається з наступними HTTP-заголовками, що містять таку інформацію про поточні обмеження:
X-Rate-Limit-Limit
: максимальна кількість запитів, дозволене протягом періода часу;X-Rate-Limit-Remaining
: Скільки залишилось дозволених запитів в поточний період часу;X-Rate-Limit-Reset
: кількість секунд, яких потрібно почекати до отримання максимальної кількості дозволених запитів.
Ви можете відключити ці заголовки, встановивши властивість yii\filters\RateLimiter::enableRateLimitHeaders у false, як показано на прикладі коду вище.