はじめに
LaravelでAPIを公開したいけど、認証なしで誰でもアクセスできるのは避けたい…。
そんなときに便利なのが「APIトークン認証」です。
今回は、認証なし・ログインなし・CSRFなしでも
最低限のアクセス制御を実現する方法を解説します!
なぜAPIトークン認証が必要?
- パブリックAPIにしたくない
- セッションベース認証が使えない(ヘッドレス)
- でも、簡単にアクセス制御したい!
というケースにピッタリです。
実装方法
1. トークンを.envに定義
MY_API_SECRET=トークンを設定
2.ミドルウェアを作成
php artisan make:middleware ApiTokenAuth
3.ミドルウェアを編集
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class ApiTokenAuth
{
public function handle(Request $request, Closure $next)
{
$token = $request->header('X-API-TOKEN');
if ($token !== env('MY_API_SECRET')) {
return response()->json(['message' => 'Unauthorized'], 401);
}
return $next($request);
}
}
4.Kernel.phpに登録
protected $middlewareAliases = [
// 既存のもの
'api.token' => \App\Http\Middleware\ApiTokenAuth::class,
];
5.ルートにミドルウェアを適用
Route::middleware('api.token')->group(function () {
Route::get('/your-api-endpoint', [ApiController::class, 'yourMethod']);
});
コールする側のコード例
use Illuminate\Support\Facades\Http;
$response = Http::withHeaders([
'X-API-TOKEN' => env('TARGET_API_TOKEN'),
])->get('https://example.com/api/your-api-endpoint');
if ($response->successful()) {
$data = $response->json();
// データ処理
}
.envに送信トークンを設定します。
TARGET_API_TOKEN=トークンを設定
※MY_API_SECRETとTARGET_API_TOKENは同じでないと認証エラーになります。
セキュリティ面の注意点
- 必ずHTTPSを使う(HTTPは絶対ダメ)
- IP制限を併用するとさらに安全
まとめ
APIトークン認証はとてもシンプルですが、適切な使い方をすれば強力な防御手段になります!