為了防止濫用,您應該考慮在您的 API 中加入速率限制。例如,您可能想要限制每位使用者的 API 使用量,在 10 分鐘內最多 100 次 API 呼叫。如果某位使用者在規定的時間內收到過多請求,則應傳回狀態碼 429(表示「請求過多」)的回應。
若要啟用速率限制,使用者身分類別 應實作 yii\filters\RateLimitInterface。此介面需要實作三個方法
getRateLimit()
:傳回允許的最大請求數和時間週期(例如,[100, 600]
表示在 600 秒內最多可以有 100 次 API 呼叫)。loadAllowance()
:傳回剩餘允許的請求數以及上次檢查速率限制時對應的 UNIX 時間戳記。saveAllowance()
:儲存剩餘允許的請求數和目前的 UNIX 時間戳記。您可能想要在使用者表格中使用兩個欄位來記錄允許量和時間戳記資訊。定義這些欄位後,就可以實作 loadAllowance()
和 saveAllowance()
來讀取和儲存對應於目前已驗證使用者的兩個欄位的值。為了提高效能,您也可以考慮將這些資訊儲存在快取或 NoSQL 儲存體中。
在 User
模型中的實作可能如下所示
public function getRateLimit($request, $action)
{
return [$this->rateLimit, 1]; // $rateLimit requests per second
}
public function loadAllowance($request, $action)
{
return [$this->allowance, $this->allowance_updated_at];
}
public function saveAllowance($request, $action, $allowance, $timestamp)
{
$this->allowance = $allowance;
$this->allowance_updated_at = $timestamp;
$this->save();
}
一旦身分類別實作了所需的介面,Yii 將自動使用 yii\filters\RateLimiter 配置為 yii\rest\Controller 的動作過濾器,以執行速率限制檢查。當超出速率限制時,速率限制器將拋出 yii\web\TooManyRequestsHttpException。
您可以在您的 REST 控制器類別中如下配置速率限制器
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
來停用這些標頭,如上面的程式碼範例所示。
發現錯字或您認為此頁面需要改進嗎?
在 github 上編輯 !
註冊 或 登入 以進行評論。