Help me een aangepaste Laravel middleware te maken voor CORS voor mijn API
description
Door deze middleware te implementeren, verbeter je de beveiliging en bruikbaarheid van je API, waardoor het naadloos kan communiceren met verschillende domeinen terwijl het zich houdt aan CORS-beleid.
prompt
try_prompt
Ik wil een aangepaste middleware in Laravel maken die Cross-Origin Resource Sharing (CORS) correct afhandelt voor mijn API. Leg uit hoe je de middleware instelt, inclusief de benodi ... more
generate_helper
...
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een stapsgewijze uitleg om een aangepaste CORS-middleware in Laravel te maken en toe te passen:
1. Middleware Aanmaken:
Gebruik de artisan command-line tool om een nieuwe middleware te genereren:
```bash
php artisan make:middleware CorsMiddleware
```
2. Middleware Implementeren:
Open de aangemaakte middleware in `app/Http/Middleware/CorsMiddleware.php` en voeg de volgende code toe:
```php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CorsMiddleware
{
public function handle(Request $request, Closure $next)
{
$response = $next($request);
// Configuratie voor CORS
$allowedOrigins = ['https://voorbeeld.com', 'https://andere-voorbeeld.com'];
$allowedMethods = ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'];
$allowedHeaders = ['Content-Type', 'Authorization', 'X-Requested-With'];
$origin = $request->headers->get('Origin');
if (in_array($origin, $allowedOrigins)) {
$response->headers->set('Access-Control-Allow-Origin', $origin);
}
$response->headers->set('Access-Control-Allow-Methods', implode(', ', $allowedMethods));
$response->headers->set('Access-Control-Allow-Headers', implode(', ', $allowedHeaders));
// Voor preflight OPTIONS-verzoeken
if ($request->getMethod() === 'OPTIONS') {
$response->setStatusCode(200);
// Mogelijk extra headers toevoegen
}
return $response;
}
}
```
3. Middleware Registreren:
Voeg de middleware toe aan je `app/Http/Kernel.php`. Bijvoorbeeld in de `$routeMiddleware` array:
```php
protected $routeMiddleware = [
// andere middleware
'cors' => \App\Http\Middleware\CorsMiddleware::class,
];
```
4. Middleware Toepassen op Routes:
Gebruik de middleware op de routes die je wilt beschermen, bijvoorbeeld in `routes/api.php`:
```php
Route::middleware(['cors'])->group(function () {
Route::prefix('v1')->group(function () {
Route::get('/users', [UserController::class, 'index']);
// andere routes
});
});
```
Of rechtstreeks op een specifieke route:
```php
Route::get('/api/v1/users', [UserController::class, 'index'])->middleware('cors');
```
**Samenvatting:**
- Maak een middleware aan met `php artisan make:middleware CorsMiddleware`.
- Implementeer de CORS-logica en headers in de middleware.
- Registreer de middleware in `Kernel.php`.
- Pas de middleware toe op routes of routegroepen die CORS-ondersteuning nodig hebben.
Zo heb je een op maat gemaakte CORS-middleware die precies volgens jouw wensen werkt.
provider: deepseek
model: deepseek-chat
Hier is een uitgebreide uitleg voor het maken van een aangepaste CORS middleware in Laravel:
## Stap 1: Middleware aanmaken
Maak eerst een nieuwe middleware aan:
```bash
php artisan make:middleware CorsMiddleware
```
## Stap 2: Middleware implementeren
Open `app/Http/Middleware/CorsMiddleware.php` en pas deze aan:
```php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class CorsMiddleware
{
public function handle(Request $request, Closure $next)
{
// Toegestane origins - pas deze aan naar je domeinen
$allowedOrigins = [
'http://localhost:3000',
'https://jouwdomein.nl',
'https://www.jouwdomein.nl',
];
// Toegestane methodes
$allowedMethods = 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
// Toegestane headers
$allowedHeaders = 'Content-Type, Authorization, X-Requested-With, X-CSRF-TOKEN';
// Controleer of de request origin is toegestaan
$origin = $request->headers->get('Origin');
if (in_array($origin, $allowedOrigins)) {
header("Access-Control-Allow-Origin: {$origin}");
}
// Voor OPTIONS requests direct antwoorden
if ($request->getMethod() === 'OPTIONS') {
header("Access-Control-Allow-Methods: {$allowedMethods}");
header("Access-Control-Allow-Headers: {$allowedHeaders}");
header("Access-Control-Max-Age: 86400"); // 24 uur cache
return response('', 200);
}
$response = $next($request);
// Headers toevoegen aan de response
$response->headers->set('Access-Control-Allow-Methods', $allowedMethods);
$response->headers->set('Access-Control-Allow-Headers', $allowedHeaders);
$response->headers->set('Access-Control-Allow-Credentials', 'true');
return $response;
}
}
```
## Stap 3: Middleware registreren
Registreer de middleware in `app/Http/Kernel.php`:
```php
protected $middleware = [
// Andere middleware...
\App\Http\Middleware\CorsMiddleware::class,
];
// OF voor route-specifieke toepassing:
protected $routeMiddleware = [
// Andere middleware...
'cors' => \App\Http\Middleware\CorsMiddleware::class,
];
```
## Stap 4: Middleware toepassen op routes
### Optie A: Globale toepassing
Als je de middleware in `$middleware` hebt gezet, wordt deze automatisch op alle requests toegepast.
### Optie B: Route-specifieke toepassing
Pas de middleware toe op specifieke routes in `routes/api.php`:
```php
<?php
use Illuminate\Support\Facades\Route;
// Toepassen op individuele route
Route::get('/v1/users', function () {
return response()->json(['message' => 'Gebruikers data']);
})->middleware('cors');
// Toepassen op route groep
Route::middleware(['cors'])->group(function () {
Route::get('/v1/users', 'UserController@index');
Route::post('/v1/users', 'UserController@store');
Route::put('/v1/users/{id}', 'UserController@update');
Route::delete('/v1/users/{id}', 'UserController@destroy');
});
// OF met prefix
Route::prefix('v1')->middleware(['cors'])->group(function () {
Route::get('/users', 'UserController@index');
Route::get('/users/{id}', 'UserController@show');
});
```
### Optie C: Via route groep in boot() methode
In `app/Providers/RouteServiceProvider.php`:
```php
public function boot()
{
$this->routes(function () {
Route::middleware(['api', 'cors'])
->prefix('api/v1')
->group(base_path('routes/api.php'));
});
}
```
## Stap 5: Configuratie via .env (Aanbevolen)
Voor meer flexibiliteit kun je de configuratie in je `.env` bestand zetten:
```env
ALLOWED_ORIGINS=http://localhost:3000,https://jouwdomein.nl
ALLOWED_METHODS=GET,POST,PUT,PATCH,DELETE,OPTIONS
ALLOWED_HEADERS=Content-Type,Authorization,X-Requested-With,X-CSRF-TOKEN
```
En pas de middleware aan:
```php
public function handle(Request $request, Closure $next)
{
$allowedOrigins = explode(',', env('ALLOWED_ORIGINS', ''));
$allowedMethods = env('ALLOWED_METHODS', 'GET, POST, PUT, PATCH, DELETE, OPTIONS');
$allowedHeaders = env('ALLOWED_HEADERS', 'Content-Type, Authorization, X-Requested-With');
// Rest van de middleware code...
}
```
## Testen
Test je CORS configuratie met:
```javascript
// Vanaf je frontend (bijvoorbeeld localhost:3000)
fetch('http://jouw-laravel-app.nl/api/v1/users')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
```
Deze setup zorgt voor een robuuste CORS implementatie die specifiek is afgestemd op je `/api/v1/users` routes en andere API endpoints.

