$request->ip(), 'user_id' => optional($request->user())->id, 'method' => $request->method(), 'uri' => $request->getRequestUri(), 'input' => $request->all(), 'headers' => $request->headers->all(), ]); $apiKey = $request->header('X-API-KEY'); $validApiKey = false; // 1. API 키가 유효한지 확인 if ($apiKey) { $validApiKey = DB::table('api_keys') ->where('key', $apiKey) ->where('is_active', true) ->exists(); } if (!$validApiKey) { return response()->json(['message' => 'Unauthorized. Invalid or missing API key'], 401); } // Bearer 인증 (Sanctum) $user = []; if($token = $request->bearerToken()) { $accessToken = PersonalAccessToken::findToken($token); if ($accessToken && $accessToken->tokenable instanceof User) { $user = $accessToken->tokenable; if ($user) { // 기본 테넌트(여러개 소속시 활성화 테넌트) $tenantId = $user->userTenants ->where('is_default', 1) ->first()?->tenant_id ?? $user->userTenants->first()?->tenant_id; $tenantId = $tenantId ?? 0; // tenant_id 설정 $request->attributes->set('tenant_id', $tenantId); app()->instance('tenant_id', $tenantId); // user_id 설정 $request->attributes->set('api_user', $user->id); app()->instance('api_user', $user->id); } } } // 화이트리스트(인증 예외 라우트) $allowWithoutAuth = [ 'api/v1/login', 'api/v1/debug-apikey', // 추가적으로 허용하고 싶은 라우트 ]; // 현재 라우트 확인 (경로 또는 이름) $currentRoute = $request->route()->uri(); // 또는 $request->path() if (!in_array($currentRoute, $allowWithoutAuth)) { // 인증정보(api_user, tenant_id) 없으면 튕김 if (!app()->bound('api_user')) { throw new AuthenticationException('회원정보 정보 없음'); } } $response = $next($request); // 응답 정보 저장 Log::info('API Response', [ 'uri' => $request->getRequestUri(), 'status' => $response->getStatusCode(), 'content' => $response->getContent(), // 응답 body도 원하면! ]); return $response; } }