Laravel Sanctumといったトークンベースの認証やSPAの認証を提供する機能や
CORS設定できたりと、サービス自体、ユーザ単位のセキュリティは担保できるようになりました。
ただし、サービスリソースへのAPIリクエストはCORSのみでカバーしきれません。
そのためX-API-KEYヘッダを実装する必要があります。
X-API-KEYは、予めサービス側で用意したAPIキーをリクエスト側(APIサーバとやり取りするバックエンドサーバ)のHTTPリクエストヘッダーに仕込み、APIサーバにてキーの認証を行う方法です。
今回は、そのX-API-KEYをLaravel11系で実装方法を記します。
比較的簡単ですが、ミドルウェアの登録方法が、以前のバージョンとは異なったため本記事を備忘とします。
Laravel11系でのX-API-KEY実装方法
.env
環境変数ファイル(.env)に、任意なAPIキーを記します。
API_KEY=key
ApiKeyMiddleware.php
app\Http\Middleware配下に任意の名前でミドルウェアファイルを作成します。
私は、ApiKeyMiddlewareとしました。
至ってシンプルにheaderのx-api-keyを取得して、存在チェック、環境変数のAPI_KEYと照会して一致すれば処理を続行、一致しなければ401エラーを返すようにしました。
<?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); } }
app.php
ミドルウェアの登録、ルートグループで適用を以前は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();
middlewareグループをapi-keyとして定義しました。
api.php
ミドルウェアグループ(api-key)内に、ルートを記したものにタスクが実行されます。
下記の場合、/test(api.phpの場合は、api/test)にアクセスしたとき、x-api-keyが一致する場合のみhelloを返すようにしました。
Route::middleware(['api-key'])->group(function () { Route::get('/test',function(){ return "hello"; }); });
これで、Headerにx-api-keyを設けてリクエストすれば検証できます。
以上
コメント