Laravel11系でX-API-KEYを使ったAPI認証(ミドルウェアの登録からルートグループで適用)の備忘録

この記事は約4分で読めます。

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で行っていましたが、
グループ追加方法が変わっていました。

Laravel - The PHP Framework For Web Artisans
Laravel is a PHP web application framework with expressive, elegant syntax. We’ve already laid the foundation — freeing ...

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を設けてリクエストすれば検証できます。

以上

コメント

スポンサーリンク
スポンサーリンク
タイトルとURLをコピーしました