> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Service Account-authenticatie - Google Sheets API for Laravel

> Configureer Service Account-authenticatie voor de Google Sheets API. Voor server-naar-server-communicatie.

Service Account-authenticatie is ideaal voor toegang tot Google Sheets van server naar server. Er is geen gebruikersactie nodig: de applicatie zelf bewerkt de spreadsheets. Dit is geschikt voor geautomatiseerde taken en achtergrondjobs.

## Gebruiksscenario's

* **Server-naar-server-toegang** — de app benadert Sheets zonder gebruikersactie
* **Geautomatiseerde systemen** — achtergrondjobs, crontaken, automatische rapporten
* **Vaste spreadsheets** — beheer van specifieke spreadsheets
* **Productieomgevingen** — betrouwbare werking zonder toestemmingsflow voor gebruikers

## Vereisten

* Google Cloud Console-project
* Google Sheets API en Google Drive API ingeschakeld
* Beheerdersrechten voor het project

## Installatie

<Steps>
  <Step title="Google Cloud-project aanmaken">
    1. Ga naar de [Google Cloud Console](https://console.cloud.google.com/)
    2. Maak een nieuw project aan of selecteer een bestaand project
    3. Noteer het project-ID
  </Step>

  <Step title="Benodigde API's inschakelen">
    1. Ga naar **APIs & Services** > **Library**
    2. Zoek en schakel de volgende API's in:
       * **Google Sheets API**
       * **Google Drive API**
  </Step>

  <Step title="Service Account aanmaken">
    1. Ga naar **APIs & Services** > **Credentials**
    2. Klik op **Create Credentials** > **Service Account**
    3. Vul de gegevens van het Service Account in:
       * **Service account name**: een beschrijvende naam (bijvoorbeeld "Laravel Sheets App")
       * **Service account ID**: wordt automatisch gegenereerd
       * **Description**: optioneel
    4. Klik op **Create and Continue**
    5. Sla beide optionele secties over en klik op **Done**
  </Step>

  <Step title="Service Account-key genereren">
    1. Klik op de pagina **Credentials** op het aangemaakte Service Account
    2. Ga naar het tabblad **Keys**
    3. Klik op **Add Key** > **Create new key**
    4. Kies **JSON** als keyformaat
    5. Klik op **Create**
    6. Het JSON-bestand wordt automatisch gedownload
  </Step>

  <Step title="JSON-bestand opslaan">
    1. Verplaats het gedownloade JSON-bestand naar `storage/app/`
    2. Hernoem het naar `google-service-account.json`
    3. **Belangrijk**: voeg het toe aan `.gitignore` om het uit versiebeheer te houden

    ```bash theme={null}
    # Toevoegen aan .gitignore
    storage/app/google-service-account.json
    ```
  </Step>

  <Step title=".env-bestand configureren">
    Voeg het volgende toe aan `.env`:

    ```env theme={null}
    GOOGLE_SERVICE_ENABLED=true
    GOOGLE_SERVICE_ACCOUNT_JSON_LOCATION=storage/app/google-service-account.json
    ```
  </Step>

  <Step title="Scopes instellen in config/google.php">
    ```php theme={null}
    'scopes' => [
        \Google\Service\Sheets::SPREADSHEETS,
        \Google\Service\Drive::DRIVE,
    ],
    ```
  </Step>

  <Step title="Spreadsheets delen">
    Voor elke Google Sheets-spreadsheet:

    1. Open de spreadsheet in Google Sheets
    2. Klik op de knop **Delen**
    3. Kopieer het veld `client_email` uit het JSON-bestand
    4. Deel de spreadsheet met dit e-mailadres (bijvoorbeeld `your-service-account@your-project-id.iam.gserviceaccount.com`)
    5. Kies de rechten:
       * **Kijker** — alleen-lezen
       * **Bewerker** — lezen en schrijven
       * **Eigenaar** — volledige toegang (niet aanbevolen)
  </Step>
</Steps>

## Gebruik

Na de configuratie wordt het Service Account automatisch gebruikt. Je hoeft geen accesstoken in te stellen.

```php theme={null}
use Revolution\Google\Sheets\Facades\Sheets;

// Het Service Account wordt automatisch gebruikt
$values = Sheets::spreadsheet('your-spreadsheet-id')
    ->sheet('Sheet1')
    ->all();

// Verwijzen op spreadsheetnaam (vereist toegang tot de Drive API)
$values = Sheets::spreadsheetByTitle('My Spreadsheet')
    ->sheet('Sheet1')
    ->all();
```

## Best practices voor beveiliging

### 1. Rechten van het Service Account beperken

* Deel alleen de spreadsheets die nodig zijn
* Gebruik **Bewerker** in plaats van **Eigenaar**
* Controleer de toegangsrechten regelmatig

### 2. Keys veilig bewaren

* Neem Service Account-keys niet op in versiebeheer
* Sluit ze betrouwbaar uit via `.gitignore`
* Sla ze in productie op een veilige plek buiten de webroot op
* Roteer keys regelmatig

### 3. Uitrol naar productie

Aanvullende beveiligingsmaatregelen:

* Sla de JSON-key op een veilige plek buiten de webroot op
* Gebruik per omgeving een ander Service Account (ontwikkeling, staging, productie)
* Monitor het gebruik van deze accounts in de Google Cloud Console
* Log verdachte activiteit en stel waarschuwingen in

## Referentie omgevingsvariabelen

| Variabele                              | Beschrijving                              | Voorbeeld                                 |
| -------------------------------------- | ----------------------------------------- | ----------------------------------------- |
| `GOOGLE_SERVICE_ENABLED`               | Service Account-authenticatie inschakelen | `true`                                    |
| `GOOGLE_SERVICE_ACCOUNT_JSON_LOCATION` | Pad naar het JSON-bestand                 | `storage/app/google-service-account.json` |

## Geavanceerde configuratie

### JSON-string opslaan in een omgevingsvariabele

In plaats van het JSON-bestand als apart bestand op te slaan, kun je de JSON-string opslaan als omgevingsvariabele. Dit is geschikt voor CI/CD-omgevingen zoals GitHub Actions.

**Stap 1: voeg de JSON-string toe aan `.env`**

```env theme={null}
GOOGLE_SERVICE_ENABLED=true
GOOGLE_SERVICE_ACCOUNT_JSON_LOCATION='{"type": "service_account", "project_id": "your-project-id", ...}'
```

**Stap 2: decodeer de JSON-string in `config/google.php`**

```php theme={null}
// config/google.php
'service' => [
    'enable' => env('GOOGLE_SERVICE_ENABLED', false),
    'file' => json_decode(env('GOOGLE_SERVICE_ACCOUNT_JSON_LOCATION', ''), true),
],
```

Met deze aanpak hoef je geen apart bestand op te slaan en kun je alles beheren via omgevingsvariabelen in je CI/CD-pipeline.

## Problemen oplossen

### Veelvoorkomende fouten

**Fout "caller does not have permission"**

* Controleer of de spreadsheet is gedeeld met het e-mailadres van het Service Account
* Controleer bij schrijfoperaties of de rechten minimaal **Bewerker** zijn

**Fout "File not found"**

* Controleer of het pad naar het JSON-bestand klopt
* Controleer of het bestand bestaat en door de webserver kan worden gelezen

**Fout "API not enabled"**

* Controleer of de Google Sheets API en Google Drive API zijn ingeschakeld in de Google Cloud Console
* Wacht na het inschakelen van de API's enkele minuten

**Fout "Invalid credentials"**

* Controleer of het JSON-keybestand geldig en niet beschadigd is
* Controleer of het Service Account niet is verwijderd of uitgeschakeld
* Controleer of het project-ID overeenkomt met je Google Cloud-project

### Setup testen

Een testroute om je Service Account-setup te controleren:

```php theme={null}
// routes/web.php
Route::get('/test-sheets', function () {
    try {
        $sheets = Sheets::spreadsheetList();
        return response()->json([
            'status' => 'success',
            'message' => 'Service Account-authenticatie werkt',
            'spreadsheet_count' => count($sheets)
        ]);
    } catch (\Exception $e) {
        return response()->json([
            'status' => 'error',
            'message' => $e->getMessage()
        ]);
    }
});
```

Open deze testroute om te controleren of de Service Account-authenticatie correct is geconfigureerd.


## Related topics

- [Google Sheets API for Laravel](/nl/packages/laravel-google-sheets/index.md)
- [OAuth 2.0-authenticatie - Google Sheets API for Laravel](/nl/packages/laravel-google-sheets/oauth.md)
- [Starter kits](/nl/starter-kits.md)
- [Laravel Socialite (sociale authenticatie)](/nl/socialite.md)
- [Vergelijking van authenticatiemethodes - Laravel Bluesky](/nl/packages/laravel-bluesky/authentication.md)
