|
|
|
Обмеження частоти запитів
|
|
|
|
===============================
|
|
|
|
|
|
|
|
Для того, щоб уникнути зловживань, вам слід подумати про додавання обмеження частоти запитів до вашого API. Наприклад,
|
|
|
|
ви можете обмежити використання API 100 запитів API протягом 10 хвилин для кожного користувача. Якщо від користувача
|
|
|
|
протягом цього періода часу приходить більша кількість запитів, буде повернена відповідь з кодом 429
|
|
|
|
(«занадто багато запитів»).
|
|
|
|
|
|
|
|
Для того щоб увімкнути обмеження частоти запитів, *[[yii\web\User::identityClass|клас user identity]]* повинен реалізовувати
|
|
|
|
інтерфейс [[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-контролерів наступним чином:
|
|
|
|
|
|
|
|
```php
|
|
|
|
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,
|
|
|
|
як показано на прикладі коду вище.
|