diff --git a/app/Http/Middleware/ApiKeyMiddleware.php b/app/Http/Middleware/ApiKeyMiddleware.php index 70a5b4b6..2c3db683 100644 --- a/app/Http/Middleware/ApiKeyMiddleware.php +++ b/app/Http/Middleware/ApiKeyMiddleware.php @@ -89,6 +89,7 @@ public function handle(Request $request, Closure $next) // Bearer 인증 (Sanctum) $user = []; + $accessToken = null; if ($token = $request->bearerToken()) { $accessToken = PersonalAccessToken::findToken($token); if ($accessToken && $accessToken->tokenable instanceof User) { @@ -114,6 +115,15 @@ public function handle(Request $request, Closure $next) } } + // MNG 내부 통신: X-TENANT-ID 헤더로 테넌트 컨텍스트 재설정 + // mng_session 토큰(InternalTokenService 발급)인 경우에만 허용 + $headerTenantId = $request->header('X-TENANT-ID'); + if ($headerTenantId && $accessToken && $accessToken->name === 'mng_session') { + $overrideTenantId = (int) $headerTenantId; + $request->attributes->set('tenant_id', $overrideTenantId); + app()->instance('tenant_id', $overrideTenantId); + } + // 화이트리스트(인증 예외 라우트) - Bearer 토큰 없이 접근 가능 $allowWithoutAuth = [ 'api/v1/login', diff --git a/app/Services/InternalTokenService.php b/app/Services/InternalTokenService.php index 8b250508..ad1dd459 100644 --- a/app/Services/InternalTokenService.php +++ b/app/Services/InternalTokenService.php @@ -97,16 +97,9 @@ public function issueToken(int $userId, int $tenantId): ?array return null; } - // 해당 테넌트에 소속되어 있는지 확인 - $userTenant = $user->userTenants()->where('tenant_id', $tenantId)->first(); - if (! $userTenant) { - Log::warning('[InternalTokenService] User not in tenant', [ - 'user_id' => $userId, - 'tenant_id' => $tenantId, - ]); - - return null; - } + // MNG 내부 토큰 교환: 테넌트 소속 검사 생략 + // HMAC 서명으로 MNG 서버 신뢰성이 검증되었으므로, + // MNG 관리자는 모든 테넌트에 접근 가능 // 기존 mng_session 토큰 삭제 (중복 방지) $user->tokens()->where('name', 'mng_session')->delete();