aiblog/app/Http/Middleware/ApiRateLimiter.php
2024-11-17 11:30:01 +08:00

36 lines
No EOL
930 B
PHP

<?php
declare(strict_types=1);
namespace App\Http\Middleware;
use Closure;
use Illuminate\Cache\RateLimiter;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class ApiRateLimiter
{
public function __construct(
protected RateLimiter $limiter
) {}
public function handle(Request $request, Closure $next): Response
{
$key = $request->user()?->id ?? $request->ip();
if ($this->limiter->tooManyAttempts($key, 60)) { // 60次/分钟
return response()->json([
'error' => 'Too Many Attempts',
'message' => 'Please try again later.',
], 429);
}
$this->limiter->hit($key);
$response = $next($request);
return $response->header('X-RateLimit-Limit', 60)
->header('X-RateLimit-Remaining', $this->limiter->remaining($key, 60));
}
}