Laravel Sanctum などによりトークンベースのSPA認証は強化されましたが、
サービス間の API リクエストでは CORS だけでは不十分 です。
そのため、X-API-KEY ヘッダを用いて API サーバ側でリクエスト元を認証する実装を行います。
ここでは Laravel 11.x 対応版 の実装方法をまとめます。
1. .env に API キーを追加
あらかじめ .env ファイルに API キーを定義します。
API_KEY=your-secret-key
2. ApiKeyMiddleware.php を作成
app/Http/Middleware に以下のようなミドルウェアを作成します。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
class ApiKeyMiddleware
{
public function handle(Request $request, Closure $next): Response
{
$apiKey = $request->header('x-api-key');
if (!$apiKey || $apiKey !== env('API_KEY')) {
return response()->json(['message' => 'Unauthorized'], 401);
}
return $next($request);
}
}
3. bootstrap/app.php でミドルウェアを登録
Laravel 11 では Kernel.php ではなく bootstrap/app.php にてミドルウェアグループを定義します。
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->group('api-key', [
\App\Http\Middleware\ApiKeyMiddleware::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})
->create();
4. routes/api.php にルートを追加
定義したミドルウェアグループ api-key を使用して、ルートを制限します。
Route::middleware(['api-key'])->group(function () {
Route::get('/test', function () {
return "hello";
});
});
この設定により、api/test に対して x-api-key を含まないリクエストは 401 Unauthorized を返すようになります。
5. 動作確認
リクエストヘッダーに x-api-key: your-secret-key を含めた状態でアクセスします。
例(cURL):
curl -H "x-api-key: your-secret-key" http://your-domain/api/test
注意点
- API キーは
.envに記載し、configキャッシュを忘れずに更新してください。 - 複数のキーを許可したい場合や、キーをDBで管理したい場合は処理を拡張してください。
- Laravel 11 では
Kernel.phpが廃止されているため、bootstrap/app.phpによる設定が必須です。
参考
以上。