legacyKey($request); if ($legacyKey === null) { // Kein Header-Key: ein in Query/Body übergebener Alt-Schlüssel wird // NICHT für die Auth akzeptiert (Zugangsdaten dürfen nicht in URLs/ // Logs landen), erhält aber weiterhin den Migrationshinweis statt // eines nichtssagenden 401 — sofern kein regulärer Bearer-Token da ist. if (blank($request->bearerToken()) && $this->hasParameterKey($request)) { return $this->migrationHintResponse(); } return $next($request); } // Ein explizit gesetzter Bearer-Token hat Vorrang. if (filled($request->bearerToken())) { return $next($request); } if (PersonalAccessToken::findToken($legacyKey) !== null) { $request->headers->set('Authorization', 'Bearer '.$legacyKey); return $next($request); } return $this->migrationHintResponse(); } /** * Legacy-Schlüssel ausschließlich aus Headern lesen. Query- und * Body-Parameter werden bewusst nicht akzeptiert, damit Zugangsdaten * nicht in URLs, Proxy-Logs oder Referrer-Headern landen. */ private function legacyKey(Request $request): ?string { $key = trim((string) ( $request->header('X-ApiKey') ?: $request->header('X-Api-Key') )); return $key === '' ? null : $key; } /** * Prüft, ob ein Alt-Schlüssel per Query- oder Body-Parameter übergeben * wurde. Wird nur genutzt, um den Migrationshinweis auszulösen — der Wert * wird nie zur Authentifizierung verwendet. */ private function hasParameterKey(Request $request): bool { return filled($request->query('api_key')) || filled($request->input('api_key')); } private function migrationHintResponse(): Response { return response()->json([ 'message' => 'This API key is not valid (anymore). Please generate a token in your customer account and send it as a Bearer token or X-ApiKey header.', 'migration_url' => url('/customer/tokens'), 'docs_url' => url('/docs/api/v1'), ], 410); } }