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