Yii2 framework backup
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

48 lines
4.1 KiB

Обмеження частоти запитів
===============================
Для того щоб уникнути зловживань, вам слід подумати про додавання обмеження частоти запитів до вашого 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,
як показано на прикладі коду вище.