När du arbetar med Laravel och Google Cloud-tjänster behöver du ofta hantera inloggningsuppgifter för tjänstkonton som kommer som JSON-filer. Dessa inloggningsuppgifter är känsliga och bör inte sparas i versionshantering, vilket gör .env filer det naturliga valet för lagring. Emellertid .env Filer är utformade för enkla nyckel-värde-par, inte komplexa JSON-strukturer. Låt oss utforska de bästa metoderna för att hantera denna vanliga utmaning.
Utmaningen
Googles tjänstkontonycklar ser vanligtvis ut så här:
{ "typ": "service_account", "project_id": "ditt-projekt-id", "private_key_id": "nyckel-id", "private_key": "-----BÖRJA PRIVAT NYCKEL-----\n...\n-----SLUT PRIVAT NYCKEL-----\n", "client_email": "[email protected]", "client_id": "123456789", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/..." }
Utmaningen är att .env Filer har inte direkt stöd för värden med flera rader eller komplexa strukturer, och den privata nyckeln innehåller tecken för nyradsändring som kan störa parsningen.
Lösning 1: Base64-kodning (rekommenderas)
Det mest tillförlitliga tillvägagångssättet är att koda din JSON som en base64-sträng. Detta eliminerar problem med specialtecken, radbrytningar och citattecken.
Implementeringssteg
Steg 1: Koda din JSON-fil
# På Linux/Mac base64 -i credentials.json -o encoded.txt # Eller med PHP php -r "echo base64_encode(file_get_contents('credentials.json'));"
Steg 2: Lägg till i din .env fil
GOOGLE_SERVICE_ACCOUNT_JSON=eyJ0eXBlIjoic2VydmljZV9hY2NvdW50IiwicHJvamVjdF9pZCI6...
Steg 3: Avkoda i din Laravel-applikation
// config/services.php returnera [ 'google' => [ 'service_account' => env('GOOGLE_SERVICE_ACCOUNT_JSON') ? json_decode(base64_decode(env('GOOGLE_SERVICE_ACCOUNT_JSON')), true) : null, ], ];
Steg 4: Använd i din applikation
använd Google\Client; klass GoogleServiceProvider { public function getClient(): Klient { $client = new Client(); $serviceAccount = config('services.google.service_account'); if ($serviceAccount) { $client->setAuthConfig($serviceAccount); $client->setScopes(['https://www.googleapis.com/auth/drive']); } return $client; } }
Lösning 2: Individuella miljövariabler
För enklare fall eller när du bara behöver specifika värden kan du extrahera enskilda fält:
GOOGLE_PROJECT_ID=ditt-projekt-id GOOGLE_CLIENT_EMAIL=service-account@project.iam.gserviceaccount.com GOOGLE_PRIVATE_KEY="-----BÖRJA PRIVAT NYCKEL-----\n...\n-----SLUT PRIVAT NYCKEL-----\n"
Rekonstruera sedan arrayen i din konfiguration:
// config/services.php returnera [ 'google' => [ 'project_id' => env('GOOGLE_PROJECT_ID'), 'client_email' => env('GOOGLE_CLIENT_EMAIL'), 'private_key' => str_replace('\\n', "\n", env('GOOGLE_PRIVATE_KEY')), ], ];
Lösning 3: JSON-sträng med escape-tecken
Du kan lagra JSON-filen som en enkelradig sträng med escape-tecken:
GOOGLE_SERVICE_ACCOUNT_JSON='{"typ":"tjänstkonto","projekt-id":"..."}'
Denna metod blir dock otymplig med privata nycklar som innehåller radnyheter och kräver noggrann escape-funktion.
Bästa metoder
1. Överför aldrig inloggningsuppgifter till versionskontroll
Inkludera alltid din .env fila in .gitignore:
.env .env.backup .env.production credentials.json *.json # Om tjänstkontofiler lagras2. Använd Laravels konfigurationscachning
Cachelagra din konfiguration i produktion för att förbättra prestandan:
php artisan-konfiguration:cacheKom ihåg att rensa cachen när du uppdaterar miljövariabler:
php artisan config:clear3. Validera konfigurationen vid programstart
Skapa en tjänsteleverantör för att validera dina Google-uppgifter tidigt:
namespace App\Providers; use Illuminate\Support\ServiceProvider; class GoogleCredentialsServiceProvider extends ServiceProvider { public function boot(): void { if (app()->environment('production')) { $this->validateGoogleCredentials(); } } private function validateGoogleCredentials(): void { $credentials = config('services.google.service_account'); if (!$credentials) { throw new \RuntimeException('Autentiseringsuppgifter för Google-tjänstkontot är inte konfigurerade'); } $requiredKeys = ['type', 'project_id', 'private_key', 'client_email']; foreach ($requiredKeys as $key) { if (!isset($credentials[$key])) { throw new \RuntimeException("Obligatorisk Google-autentiseringsuppgifter saknas: {$key}"); } } } }
4. Använd miljöspecifika filer
Laravel stöder miljöspecifika .env filer:
.miljö.lokal– Lokal utveckling.miljötestning– Testmiljö.env.staging– Scenmiljö.miljö.produktion– Produktionsmiljö
5. Implementera nyckelrotation
Skapa ett kommando för att rotera servicekontonycklar:
namespace App\Console\Commands; use Illuminate\Console\Command; class RotateGoogleCredentials extends Command { protected $signature = 'google:rotate-credentials {path : Sökväg till ny JSON-fil}'; protected $description = 'Rotera Google-tjänstkontouppgifter'; public function handle(): int { $path = $this->argument('path'); if (!file_exists($path)) { $this->error("Filen hittades inte: {$path}"); return 1; } $json = file_get_contents($path); $encoded = base64_encode($json); $this->info('Lägg till detta i din .env-fil:'); $this->line("GOOGLE_SERVICE_ACCOUNT_JSON={$encoded}"); // Validera eventuellt de nya inloggningsuppgifterna $credentials = json_decode($json, true); if (!$credentials) { $this->error('Ogiltig JSON-fil'); return 1; } $this->info('✓ Inloggningsuppgifterna har validerats'); return 0; } }
6. Använd Laravel-kryptering för extra säkerhet
För mycket känsliga miljöer, överväg att kryptera inloggningsuppgifterna:
// Lagrar krypterade inloggningsuppgifter $encrypted = encrypt(file_get_contents('credentials.json')); // Lagrar $encrypted i .env // Hämtar och dekrypterar $credentials = json_decode(decrypt(env('GOOGLE_SERVICE_ACCOUNT_JSON_ENCRYPTED')), true);
7. Dokumentera din strategi
Dokumentera alltid din valda metod i projektets README-fil:
## Konfiguration av Google-tjänstkonto 1. Hämta JSON-filen för ditt tjänstkonto från Google Cloud Console 2. Koda filen: `base64 -i credentials.json` 3. Kopiera utdata till `.env`: `GOOGLE_SERVICE_ACCOUNT_JSON= ` 4. Rensa konfigurationscachen: `php artisan config:clear` 5. Testa anslutningen: `php artisan google:test-connection`
Säkerhetsöverväganden
- Principen om minsta privilegiumGe endast de lägsta nödvändiga behörigheterna till ditt tjänstkonto
- Regelbundna revisionerGranska regelbundet vilka tjänstkonton som har åtkomst till dina resurser
- Övervaka användningAnvänd Google Clouds granskningsloggar för att övervaka aktivitet på tjänstkonton
- Säker förvaringÖverväg att använda följande i produktionen:
- AWS Secrets Manager
- Googles hemliga chef
- Azure Key Vault
- HashiCorp-valvet
Alternativ: Filbaserad metod
I vissa fall kan det vara renare att hålla JSON-filen separat:
// config/services.php returnera [ 'google' => [ 'service_account_path' => env('GOOGLE_APPLICATION_CREDENTIALS', storage_path('credentials/google.json')), ], ]; // Användning $client = new Client(); $client->setAuthConfig(config('services.google.service_account_path'));
Sedan in .env:
GOOGLE_APPLICATION_CREDENTIALS=/sökväg/till/credentials.jsonSlutsats
Medan .env Eftersom filer inte utformades för komplexa JSON-strukturer, ger base64-kodningsmetoden en pålitlig, säker och lättskött lösning för att lagra inloggningsuppgifter för Google-tjänstkonton i Laravel-applikationer. Genom att följa dessa bästa metoder kan du säkerställa att dina inloggningsuppgifter förblir säkra samtidigt som du upprätthåller en ren och professionell kodbas.
Kom ihåg att säkerhet inte är en engångsinstallation utan en pågående process. Granska regelbundet dina rutiner för hantering av autentiseringsuppgifter, håll dina beroenden uppdaterade och följ alltid principen om minsta möjliga behörighet när du konfigurerar tjänstkonton.
För produktionsmiljöer, överväg att gå bortom .env filer till dedikerade lösningar för hantering av hemligheter som ger bättre säkerhetsfunktioner som automatisk rotation, granskningsloggning och detaljerad åtkomstkontroll.
Senast uppdaterad 8 september 2025
