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.
 
 
 
 
 

2.6 KiB

Limit użycia

W celu zapobiegnięcia nadużyciom, powinno się rozważyć wprowadzenie limitu użycia swojego API. Może to być na przykład ograniczenie do maksymalnie 100 zapytań do API dla każdego użytkownika w czasie 10 minut. Jeśli użytkownik przekroczy ten limit w zadanym czasie, należy zwrócić odpowiedź ze statusem 429 (oznaczającym "Zbyt dużo zapytań").

Aby ustalić limit użycia, yii\web\User::identityClass powinna zaimplementować yii\filters\RateLimitInterface. Interfejs ten wymaga dodania trzech metod:

  • getRateLimit(): zwraca maksymalną liczbę zapytań i okres czasu (np. [100, 600] oznacza maksymalnie 100 zapytań do API w czasie 600 sekund).
  • loadAllowance(): zwraca liczbę pozostałych dozwolonych zapytań z limitu i uniksowy znacznik czasu wskazujący datę ostatniego sprawdzenia limitu.
  • saveAllowance(): zapisuje liczbę pozostałych dozwolonych zapytań i aktualny uniksowy znacznik czasu.

Do celów obsługi powyższych metod można wykorzystać dwie dodatkowe kolumny w bazie danych użytkowników dla liczby dokonanych połączeń i znacznika czasu. Po ustaleniu tych wartości, metody loadAllowance() i saveAllowance() mogą być poprawnie zaimplementowane do odczytu i zapisu tych wartości dla aktualnego zautoryzowanego użytkownika. Aby zwiększyć wydajność tego mechanizmu, należy rozważyć użycie pamięci podręcznej lub bazy typu NoSQL.

Po zaimplemetowaniu wymaganego interfejsu, Yii automatycznie użyje yii\filters\RateLimiter, skonfigurowanego jako filtr akcji dla yii\rest\Controller, aby pilnować limitu użycia API. Mechanizm rzuci wyjątek yii\web\TooManyRequestsHttpException, kiedy limit zostanie przekroczony.

Po dodaniu limitu, każda odpowiedź będzie domyślnie zawierała następujące nagłówki HTTP, zawierające informacje o aktualnym użyciu limitu:

  • X-Rate-Limit-Limit, maksymalna liczba zapytań w zadanym okresie czasu,
  • X-Rate-Limit-Remaining, liczba pozostałych dozwolonych zapytań z limitu w aktualnym okresie czasu,
  • X-Rate-Limit-Reset, liczba sekund, którą należy odczekać, aby uzyskać ponownie maksymalną liczbę zapytań z limitu.

Wysyłanie powyższych nagłówków można wyłączyć konfigurując yii\filters\RateLimiter::enableRateLimitHeaders w klasie kontrolera REST jak w poniższym przykładzie.

public function behaviors()
{
    $behaviors = parent::behaviors();
    $behaviors['rateLimiter']['enableRateLimitHeaders'] = false;
    return $behaviors;
}