Zum Inhalt springen

Einen Google Calendar verbinden

Diese Anleitung zeigt, wie du Google Calendar mit einem Arbeitsbereich verbindest. Die Verbindung gilt pro Arbeitsbereich: Sie synchronisiert die Termine dieses Arbeitsbereichs schreibgeschützt nach Control Center. Wie das zusammenhängt, steht unter Kalender und Terminplanung.

  1. Öffne Kalender in der Seitenleiste.
  2. Klicke in der Kalender-Seitenleiste auf Kalenderkonto hinzufügen. (Dieselbe Stelle liegt unter Einstellungen → Arbeitsbereich → Profil und Identität, bei Google Calendar.)
  3. Wähle, wie du autorisierst:
    • Google-App von Control Center verwenden — nichts einzurichten. Das ist die Vorgabe, wenn dein Build eine mitliefert.
    • Eigenen Google-Cloud-Client verwenden — füge eine Client-ID und ein Secret aus deinem eigenen Projekt ein (siehe Einen eigenen Google-Client mitbringen).
  4. Klicke auf Google Calendar verbinden. Der Dialog zeigt einen kurzen Code und einen Link zu Googles Geräteseite.
  5. Öffne diese Seite auf einem beliebigen Gerät, gib den Code ein und genehmige den angeforderten Zugriff. Der Dialog schließt sich von selbst, und die Synchronisierung deiner Termine beginnt.

Den Austausch führt der Server aus, nicht dein Gerät, und er behält das daraus entstehende Refresh-Token — deshalb bestätigst du den Code auf einem „beliebigen Gerät“ und nicht speziell in dieser App.

Das Konto ist nur mit dem aktiven Arbeitsbereich verbunden. Wechselst du den Arbeitsbereich, siehst du die Kalender dieses Arbeitsbereichs.

Der Verbindungsablauf fordert calendar.readonly plus deine E-Mail an — dieselben Scopes für die eingebaute App und für einen Client, den du einfügst. Control Center liest Termine. Es legt nichts an, bearbeitet nichts, löscht nichts und beantwortet keine Einladungen bei Google.

Der Server besitzt den Zeitplan: Alle zwei Minuten durchläuft er die verbundenen Konten jedes Arbeitsbereichs und schreibt die Termine in die Datenbank des Arbeitsbereichs. Clients sprechen nie mit Google — sie lesen, was der Server geschrieben hat.

Der Durchlauf ist inkrementell. Der erste Durchgang je Kalender holt ein gleitendes Fenster (60 Tage zurück, 90 Tage voraus) und merkt sich Googles Sync-Token; spätere Durchgänge legen dieses Token vor und erhalten nur, was sich geändert hat. Genau das macht einen Takt von zwei Minuten tragbar. Das Fenster wird alle 24 Stunden und immer dann, wenn Google das Token ungültig macht, mit einer vollständigen Synchronisierung neu verankert.

Refresh-Tokens liegen serverseitig in secrets.json im Datenverzeichnis des Servers, nur für den Eigentümer geschrieben (0600) — nicht im Schlüsselbund des Betriebssystems und nie auf einem Client-Gerät.

Ein Arbeitsbereich kann mehrere Google-Konten verbinden (etwa Arbeit und privat). Wiederhole den Verbindungsschritt für jedes Konto; ihre Termine fließen in dieselben Ansichten für Monat, Woche und Agenda. Jedes Konto synchronisiert und erneuert sein Token unabhängig, und jedes lässt sich einzeln trennen.

Erklärt Google das Token eines Kontos dauerhaft für ungültig (eine widerrufene oder lange abgelaufene Sitzung), stoppt die Synchronisierung. Control Center zeigt auf dem Kalender ein Banner Erneut verbinden und eine Desktop-Benachrichtigung. Klicke auf Erneut verbinden und bestätige einen neuen Code; das Banner verschwindet bei der nächsten erfolgreichen Synchronisierung.

Klicke in der Kalender-Seitenleiste (oder unter Einstellungen → Arbeitsbereich → Profil und Identität) beim Konto auf Trennen. Das löscht die synchronisierten Termine und entfernt die gespeicherten Tokens auf dem Server.

Ein Server ohne angeschlossene Oberfläche verbindet dasselbe Konto über sein eigenes Terminal:

Terminalfenster
GOOGLE_OAUTH_CLIENT_ID=<id> GOOGLE_OAUTH_CLIENT_SECRET=<secret> \
cc_server calendar connect --data-dir <dir> --workspace <workspace-id>

Er gibt einen Code und eine URL aus, wartet auf die Bestätigung, speichert dann die Tokens und synchronisiert beim nächsten Durchlauf.

Ein Build aus dem Quellcode bringt keinen Google-Client mit, deshalb sind ID und Secret erforderlich — setze GOOGLE_OAUTH_CLIENT_ID und GOOGLE_OAUTH_CLIENT_SECRET. Ein Flag --google-client-id gibt es nicht (unbekannte Flags werden ignoriert). Ohne das Paar in der Umgebung beendet sich der Befehl mit einem Fehler, weil der Client fehlt.

Einen eigenen Google-Client mitbringen (Forks und Self-Hosting)

Abschnitt betitelt „Einen eigenen Google-Client mitbringen (Forks und Self-Hosting)“

Release-Builds bringen einen Google-Client mit, deshalb kommen die meisten damit nie in Berührung. Bring deinen eigenen mit, wenn du aus dem Quellcode baust, einen eigenen Server betreibst oder der Zustimmungsbildschirm dein eigenes Projekt nennen soll.

  1. Aktiviere in der Google Cloud Console die Google Calendar API und richte den OAuth-Zustimmungsbildschirm ein. Füge die Scopes calendar.readonly, openid und email hinzu. Solange die App nicht verifiziert ist, trag dich als Testnutzer ein. calendar.events auf dem Zustimmungsbildschirm schaltet keine Zu- oder Absage frei — Control Center fordert diesen Scope nie an.
  2. Lege eine OAuth-Client-ID vom Anwendungstyp TVs and limited input devices an und kopiere Client-ID und Client-Secret.
  3. Gib sie entweder pro Verbindung an (wähle im Dialog Eigenen Google-Cloud-Client verwenden) oder serverweit mit GOOGLE_OAUTH_CLIENT_ID und GOOGLE_OAUTH_CLIENT_SECRET.

Ein serverweites Paar ersetzt das eingebaute überall, auch hinter der Option „Google-App von Control Center verwenden“ — auf deinem eigenen Server ist diese Option deine App.

Das Client-Secret verlässt den Server nie: Keine RPC-Antwort enthält es, und ein Konto, das über den eigenen Client des Servers verbunden wurde, speichert eine Markierung statt einer Kopie des Paars. Zum Rotieren reicht ein Neustart mit dem neuen Wert.

Symptom Wahrscheinliche Ursache
Der Dialog bietet keine eingebaute Option Dieser Build bringt keinen Google-Client mit (ein Quellcode-Build), oder der Server wurde nur mit einer Hälfte des Paars gestartet. ID und Secret sind beide erforderlich
invalid_scope beim Start des Ablaufs Calendar ist für einen Device-Code-Client in diesem Cloud-Projekt nicht erlaubt. Nimm stattdessen ein Projekt mit Loopback- oder Web-Client
invalid_client von Google Der Client ist kein Client vom Typ TVs and limited input devices, oder ID und Secret stammen von verschiedenen Clients
Die Bestätigung gelingt, die Synchronisierung bleibt leer Dein Konto ist auf dem Zustimmungsbildschirm kein Testnutzer, oder calendar.readonly wurde nicht gewährt
Der Code läuft ab, bevor du ihn bestätigst Device-Codes sind kurzlebig. Starte die Verbindung erneut, um einen neuen zu bekommen
„Antwort konnte nicht aktualisiert werden“ bei einer Zu- oder Absage Erwartet: Der Verbindungsablauf fordert calendar.events nie an
Die Synchronisierung stoppt mit einer Warnung beim Token-Refresh im Serverprotokoll Das Konto wurde mit einem Client verbunden, der nicht mehr konfiguriert ist. Verbinde das Konto erneut, oder setze diese Client-ID und dieses Secret wieder