Чтобы избежать злоупотреблений, вам следует подумать о добавлении ограничения частоты запросов к вашим API. Например, вы можете ограничить
использование каждого метода API, поставив для каждого пользователя ограничение: не более 100 вызовов API в течение 10 минут. Если от пользователя
приходит большее количество запросов в течение этого периода времени, будет возвращаться ответ с кодом состояния 429 (означающий «слишком много запросов»).
Чтобы включить ограничение частоты запросов, *[[yii\web\User::identityClass|класс user identity]]* должен реализовывать интерфейс [[yii\filters\RateLimitInterface]].
Этот интерфейс требует реализации следующих трех методов:
*`getRateLimit()`: возвращает максимальное количество разрешенных запросов и период времени, например `[100, 600]`, что означает не более 100 вызовов API в течение 600 секунд.
*`loadAllowance()`: возвращает оставшееся количество разрешенных запросов и соответствующий *UNIX-timestamp*,
когда ограничение проверялось в последний раз.
Чтобы избежать злоупотреблений, вам следует подумать о добавлении ограничения частоты запросов к вашим 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*.
В методах `loadAllowance()` и `saveAllowance()` необходимо реализовать загрузку и сохранение данных по API запросам. Для этого, например, можно использовать два столбца в таблице пользователей - количество оставшихся разрешённых запросов и отметку времени, когда произодился последний запрос. Такая реализация позволит ограничить частоту запросов от аутентифицированного пользователя. Также можно перенести хранение этих данных в NoSQL-хранилище или кэш, для улучшения производительности.
Вы можете использовать два столбца в таблице user для хранения количества разрешённых запросов и времени последней проверки.
В методах `loadAllowance()` и `saveAllowance()` можно реализовать чтение и сохранение значений этих столбцов в соответствии
с данными текущего аутентифицированного пользователя. Для улучшения производительности можно попробовать хранить эту
информацию в кеше или NoSQL хранилище.
Вы можете также использовать два столбца в таблице пользователей для записи количества разрешенных запросов и *отметки времени*.
`loadAllowance()` и `saveAllowance()` могут быть реализованы как чтение и сохранение значений, относящихся к текущему аутентифицированному пользователю,
в этих двух столбцах. Для улучшения производительности вы можете подумать о том, чтобы хранить эту информацию
в кэше или каком-либо NoSQL-хранилище.
Как только соответствующий интерфейс будет реализован в классе identity, Yii начнёт автоматически проверять ограничения
частоты запросв при помощи [[yii\filters\RateLimiter]], фильтра действий для [[yii\rest\Controller]]. При превышеии
ограничений будет выброшено исключение [[yii\web\TooManyRequestsHttpException]].
Если *[[yii\web\User::identityClass|класс user identity]]* реализует требуемый интерфейс, то Yii будет автоматически использовать [[yii\filters\RateLimiter]], настроенный как фильтр для действий в [[yii\rest\Controller]], для выполнения проверки на количество разрешенных запросов. Если ограничение на количество запросов будет превышено, выбрасывается исключение [[yii\web\TooManyRequestsHttpException]]. Вы можете настроить ограничитель частоты запросов в ваших классах REST-контроллеров следующим образом:
Вы можете настроить ограничитель частоты запросов в ваших классах REST-контроллеров следующим образом:
```php
publicfunctionbehaviors()
...
...
@@ -31,11 +35,13 @@ public function behaviors()
}
```
Когда ограничение частоты запросов реализовано, то каждый ответ, по умолчанию, будет возвращаться со следующими HTTP-заголовками, содержащими информацию о текущих ограничениях:
При включенном ограничении частоты запросов каждый ответ, по умолчанию, возвращается со следующими HTTP-заголовками,
содержащими информацию о текущих ограничениях:
*`X-Rate-Limit-Limit`: максимальное количество запросов, разрешенное в течение периода времени;
*`X-Rate-Limit-Remaining`: оставшееся количество разрешенных запросов в текущем периоде времени;
*`X-Rate-Limit-Reset`: количество секунд, которое нужно подождать до получения максимального количества разрешенных запросов.
*`X-Rate-Limit-Limit`: максимальное количество запросов, разрешённое в течение периода времени;
*`X-Rate-Limit-Remaining`: оставшееся количество разрешённых запросов в текущем периоде времени;
*`X-Rate-Limit-Reset`: количество секунд, которое нужно подождать до получения максимального количества разрешённых
запросов.
Вы можете отключить эти заголовки, установив свойство [[yii\filters\RateLimiter::enableRateLimitHeaders]] в значение false,
Вы можете отключить эти заголовки, установив свойство [[yii\filters\RateLimiter::enableRateLimitHeaders]] в false,