Push-Benachrichtigungen

In diesem Dokument wird beschrieben, wie Sie Push-Benachrichtigungen verwenden, mit denen Ihre Anwendung informiert wird, wenn sich eine Ressource ändert.

Überblick

Die Directory API bietet Push-Benachrichtigungen, mit denen Sie Änderungen an Ressourcen überwachen können. Mit diesem Feature können Sie die Leistung Ihrer Anwendung verbessern. Sie können die zusätzlichen Netzwerk- und Rechenkosten für das Abfragen von Ressourcen eliminieren, um festzustellen, ob sie sich geändert haben. Bei jeder Änderung einer beobachteten Ressource wird Ihre Anwendung von der Directory API benachrichtigt.

Wenn Sie Push-Benachrichtigungen verwenden möchten, müssen Sie zwei Dinge tun:

  • Richten Sie die Empfangs-URL oder den Webhook-Rückrufempfänger ein.

    Dieser HTTPS-Server verarbeitet die API-Benachrichtigungen, die ausgelöst werden, wenn sich eine Ressource ändert.

  • Richten Sie für jeden Ressourcenendpunkt, den Sie überwachen möchten, einen Benachrichtigungskanal ein.

    Ein Kanal gibt Routinginformationen für Benachrichtigungen an. Bei der Kanaleinrichtung musst du die jeweilige URL angeben, unter der du Benachrichtigungen erhalten möchtest. Wenn sich die Ressource eines Kanals ändert, sendet die Directory API eine Benachrichtigung als POST-Anfrage an diese URL.

Derzeit unterstützt die Directory API Benachrichtigungen über Änderungen an der Ressource Nutzer.

Benachrichtigungskanäle erstellen

Zum Anfordern von Push-Benachrichtigungen müssen Sie für jede Ressource, die Sie überwachen möchten, einen Benachrichtigungskanal einrichten. Nachdem die Benachrichtigungskanäle eingerichtet sind, informiert die Directory API Ihre Anwendung über beobachtete Ressourcenänderungen.

Wiedergabeanfragen stellen

Jeder Watchable Directory API-Ressource ist eine watch-Methode mit einem URI der folgenden Form zugeordnet:

https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch

Zum Einrichten eines Benachrichtigungskanals für Nachrichten über Änderungen an einer bestimmten Ressource senden Sie eine POST-Anfrage an die Methode watch für die Ressource.

Jeder Benachrichtigungskanal ist sowohl einem bestimmten Nutzer als auch einer bestimmten Ressource (oder Gruppe von Ressourcen) zugeordnet. Eine watch-Anfrage ist nur erfolgreich, wenn der aktuelle Nutzer oder das aktuelle Dienstkonto Inhaber oder Zugriffsberechtigung für diese Ressource hat.

Beispiele

Alle Überwachungsanfragen an die Ressource User für eine einzelne Domain haben das allgemeine Format:

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=domain&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

Verwenden Sie die Parameter domain und event, um die Domain und den Ereignistyp anzugeben, für den Sie Benachrichtigungen erhalten möchten.

Alle Überwachungsanfragen für die Nutzerressource für einen Kunden haben das allgemeine Format:

POST https://admin.googleapis.com/admin/directory/users/v1/watch?customer=customer&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

Verwenden Sie die Parameter customer und event, um die eindeutige ID des Google-Kontos des Kunden und die Art des Ereignisses anzugeben, für das Sie Benachrichtigungen erhalten möchten.

Für event sind folgende Werte möglich:

  • add: vom Nutzer erstelltes Ereignis
  • delete: vom Nutzer gelöschter Termin
  • makeAdmin: Nutzeradministrator-Statusänderungsereignis
  • undelete: Nutzer hat Ereignis wiederhergestellt
  • update: vom Nutzer aktualisiertes Ereignis

Hinweis:In den folgenden Beispielen wird der Anfragetext aus Gründen der Übersichtlichkeit weggelassen.

Achten Sie auf von Nutzern erstellte Ereignisse für die Domain mydomain.com:

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=mydomain.com&event=add

Achten Sie auf von Nutzern erstellte Ereignisse für den Kunden my_customer:

POST https://admin.googleapis.com/admin/directory/v1/users/watch?customer=my_customer&event=add

Erforderliche Properties

Bei jeder watch-Anfrage musst du diese Felder angeben:

  • Ein id-Attributstring, der diesen neuen Benachrichtigungskanal in Ihrem Projekt eindeutig identifiziert. Wir empfehlen die Verwendung einer UUID (Universally Unique Identifier) oder eines ähnlichen eindeutigen Strings. Maximale Länge: 64 Zeichen

    Der von Ihnen festgelegte ID-Wert wird im HTTP-Header X-Goog-Channel-Id jeder Benachrichtigung, die Sie für diesen Kanal erhalten, wieder zurückgegeben.

  • Ein String des Attributs type, der auf den Wert web_hook festgelegt ist.

  • Ein String des Attributs address, der auf die URL festgelegt ist, die Benachrichtigungen für diesen Benachrichtigungskanal anhört und darauf antwortet. Dies ist die Webhook-Callback-URL. Sie muss HTTPS verwenden.

    Die Directory API kann nur dann Benachrichtigungen an diese HTTPS-Adresse senden, wenn auf Ihrem Webserver ein gültiges SSL-Zertifikat installiert ist. Folgende Zertifikate sind nicht gültig:

    • selbst signierte Zertifikate.
    • von einer nicht vertrauenswürdigen Quelle signierte Zertifikate
    • gesperrte Zertifikate
    • Zertifikate mit einem Betreff, der nicht mit dem Zielhostnamen übereinstimmt.

Optionale Attribute

Du kannst diese optionalen Felder auch in deiner watch-Anfrage angeben:

  • Eine token-Eigenschaft, die einen beliebigen Stringwert angibt, der als Kanaltoken verwendet werden soll. Sie können Tokens für Benachrichtigungskanäle für verschiedene Zwecke verwenden. Mit dem Token können Sie beispielsweise prüfen, ob jede eingehende Nachricht zu einem von Ihrer Anwendung erstellten Kanal gehört. So lässt sich verhindern, dass die Benachrichtigung gefälscht wird. Außerdem können Sie die Nachricht basierend auf dem Zweck dieses Kanals an das richtige Ziel in Ihrer Anwendung weiterleiten. Maximale Länge: 256 Zeichen

    Das Token ist im HTTP-Header X-Goog-Channel-Token in jeder Benachrichtigung enthalten, die Ihre Anwendung für diesen Kanal empfängt.

    Wenn Sie Tokens für Benachrichtigungskanäle verwenden, empfehlen wir Folgendes:

    • Verwenden Sie ein erweiterbares Codierungsformat, z. B. URL-Suchparameter. Beispiel: forwardTo=hr&createdBy=mobile

    • Geben Sie keine sensiblen Daten wie OAuth-Tokens an.

  • Ein expiration-Attributstring, festgelegt auf einen Unix-Zeitstempel (in Millisekunden) für das Datum und die Uhrzeit, ab dem die Directory API keine Nachrichten mehr für diesen Benachrichtigungskanal senden soll.

    Wenn ein Kanal eine Ablaufzeit hat, wird dieser als Wert des HTTP-Headers X-Goog-Channel-Expiration (im visuell lesbaren Format) in jede Benachrichtigung eingefügt, die Ihre Anwendung für diesen Kanal erhält.

Weitere Informationen zur Anfrage finden Sie in der API-Referenz in der Methode watch für die Ressource Users.

Antwort ansehen

Wenn die watch-Anfrage erfolgreich einen Benachrichtigungskanal erstellt hat, wird der HTTP-Statuscode 200 OK zurückgegeben.

Der Nachrichtentext der Smartwatch-Antwort enthält Informationen über den gerade erstellten Benachrichtigungskanal, wie im folgenden Beispiel dargestellt.

{
  "kind": "api#channel",
  "id": "01234567-89ab-cdef-0123456789ab", // ID you specified for this channel.
  "resourceId": "B4ibMJiIhTjAQd7Ff2K2bexk8G4", // ID of the watched resource.
  "resourceUri": "https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event", // Version-specific ID of the watched resource.
  "token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
  "expiration": 1384823632000, // Actual expiration time as Unix timestamp (in ms), if applicable.
}

Neben den Properties, die Sie im Rahmen der Anfrage gesendet haben, enthalten die zurückgegebenen Informationen auch resourceId und resourceUri zur Identifizierung der Ressource, die von diesem Benachrichtigungskanal beobachtet wird.

Sie können die zurückgegebenen Informationen an andere Benachrichtigungskanalvorgänge weitergeben, z. B. wenn Sie keine Benachrichtigungen mehr erhalten möchten.

Weitere Informationen zur Antwort finden Sie in der API-Referenz in der Methode watch für die Ressource Users.

Nachricht synchronisieren

Nachdem Sie einen Benachrichtigungskanal zum Überwachen einer Ressource erstellt haben, sendet die Directory API eine sync-Nachricht, um anzugeben, dass Benachrichtigungen gestartet werden. Der X-Goog-Resource-State-HTTP-Header-Wert für diese Nachrichten lautet sync. Aufgrund von Zeitproblemen im Netzwerk kann es sein, dass die Nachricht sync empfangen wird, bevor Sie die Antwort der Methode watch erhalten haben.

Sie können die sync-Benachrichtigung ignorieren, aber Sie können sie auch verwenden. Wenn du den Kanal beispielsweise nicht behalten möchtest, kannst du die Werte X-Goog-Channel-ID und X-Goog-Resource-ID in einem Aufruf verwenden, um keine Benachrichtigungen mehr zu erhalten. Sie können auch die Benachrichtigung sync verwenden, um einige Initialisierungsschritte auszuführen, um sich auf spätere Ereignisse vorzubereiten.

Das Format der sync-Nachrichten, die die Directory API an die Empfänger-URL sendet, wird unten angezeigt.

POST https://mydomain.com/notifications // Your receiving URL.
X-Goog-Channel-ID: channel-ID-value
X-Goog-Channel-Token: channel-token-value
X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format. Present only if the channel expires.
X-Goog-Resource-ID: identifier-for-the-watched-resource
X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
X-Goog-Resource-State: sync
X-Goog-Message-Number: 1

Synchronisierungsnachrichten haben immer den X-Goog-Message-Number-HTTP-Header-Wert 1. Jede nachfolgende Benachrichtigung für diesen Kanal hat eine größere Nachrichtennummer als die vorherige. Die Nachrichtennummern sind jedoch nicht fortlaufend.

Benachrichtigungskanäle verlängern

Ein Benachrichtigungskanal kann eine Ablaufzeit mit einem Wert haben, der entweder durch Ihre Anfrage oder durch interne Limits oder Standardeinstellungen der Directory API festgelegt wird (es wird der restriktivere Wert verwendet). Die Ablaufzeit des Kanals, falls vorhanden, wird als Unix-Zeitstempel (in Millisekunden) in die Informationen aufgenommen, die von der Methode watch zurückgegeben werden. Darüber hinaus werden das Ablaufdatum und die Ablaufzeit (in visuell lesbarem Format) in jeder Benachrichtigung, die Ihre Anwendung für diesen Kanal erhält, im HTTP-Header X-Goog-Channel-Expiration angegeben.

Derzeit gibt es keine automatische Möglichkeit, einen Benachrichtigungskanal zu verlängern. Wenn ein Kanal kurz vor seinem Ablauf steht, müssen Sie ihn durch einen neuen ersetzen. Rufen Sie dazu die Methode watch auf. Wie immer musst du einen eindeutigen Wert für die Eigenschaft id des neuen Kanals verwenden. Beachten Sie, dass es wahrscheinlich einen „Überlappungszeitraum“ gibt, in dem die beiden Benachrichtigungskanäle für dieselbe Ressource aktiv sind.

Benachrichtigungen erhalten

Immer wenn sich eine überwachte Ressource ändert, erhält Ihre Anwendung eine Benachrichtigung, in der die Änderung beschrieben wird. Die Directory API sendet diese Nachrichten als HTTPS-POST-Anfragen an die URL, die Sie als Attribut address für diesen Benachrichtigungskanal angegeben haben.

Nachrichtenformat für Benachrichtigungen interpretieren

Alle Benachrichtigungen enthalten eine Reihe von HTTP-Headern mit dem Präfix X-Goog-. Einige Arten von Benachrichtigungen können auch einen Nachrichtentext enthalten.

Header

Benachrichtigungen, die von der Directory API an Ihre empfangende URL gesendet werden, enthalten die folgenden HTTP-Header:

Header Beschreibung
Immer präsentieren
X-Goog-Channel-ID UUID oder ein anderer eindeutiger String, den Sie zur Identifizierung dieses Benachrichtigungskanals angegeben haben.
X-Goog-Message-Number Ganzzahl, die diese Nachricht für diesen Benachrichtigungskanal identifiziert. Bei sync-Nachrichten ist immer 1 der Wert. Bei jeder weiteren Nachricht auf dem Kanal erhöht sich die Nummer der Nachrichten. Sie werden jedoch nicht fortlaufend gesendet.
X-Goog-Resource-ID Ein intransparenter Wert, der die beobachtete Ressource identifiziert. Diese ID ist in allen API-Versionen stabil.
X-Goog-Resource-State Der neue Ressourcenstatus, der die Benachrichtigung ausgelöst hat. Mögliche Werte: sync oder ein Ereignisname.
X-Goog-Resource-URI Eine API-versionsspezifische Kennung für die überwachte Ressource.
Manchmal vorhanden
X-Goog-Channel-Expiration Datum und Uhrzeit des Ablaufs des Benachrichtigungskanals in menschenlesbarem Format. Ist nur vorhanden, wenn definiert.
X-Goog-Channel-Token Token des Benachrichtigungskanals, das von Ihrer Anwendung festgelegt wurde und mit dem Sie die Benachrichtigungsquelle prüfen können. Ist nur vorhanden, wenn definiert.

Benachrichtigungen für Nutzer enthalten im Anfragetext die folgenden Informationen:

Property Beschreibung
kind Kennzeichnet dies als Nutzerressource. Wert: der feste String „admin#directory#user
id Eindeutige ID der Nutzerressource.
etag Das ETag der Benachrichtigungsnachricht. Es unterscheidet sich vom ETag der Nutzerressource.
primaryEmail Die primäre E-Mail-Adresse des Nutzers.

Beispiele

Benachrichtigungen für User-Ressourcenereignisse haben folgendes allgemeines Format:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: directoryApiId
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 29 Oct 2013 20:32:02 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: 'https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event
X-Goog-Resource-State:  event
X-Goog-Message-Number: 10

{
  "kind": "admin#directory#user",
  "id": long,
  "etag": string,
  "primaryEmail": string
}

Beispiel für ein vom Nutzer gelöschtes Ereignis:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 189
X-Goog-Channel-ID: deleteChannel
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Mon, 09 Dec 2013 22:24:23 GMT
X-Goog-Resource-ID:  B4ibMJiIhTjAQd7Ff2K2bexk8G4
X-Goog-Resource-URI: https://admin.googleapis.com/admin/directory/v1/users?domain=mydomain.com&event=delete&alt=json
X-Goog-Resource-State:  delete
X-Goog-Message-Number: 236440

{
  "kind": "admin#directory#user",
  "id": "111220860655841818702",
  "etag": "\"Mf8RAmnABsVfQ47MMT_18MHAdRE/evLIDlz2Fd9zbAqwvIp7Pzq8UAw\"",
  "primaryEmail": "user@mydomain.com"
}

Auf Benachrichtigungen reagieren

Wenn der Vorgang erfolgreich war, können Sie einen der folgenden Statuscodes zurückgeben: 200, 201, 202, 204 oder 102.

Wenn Ihr Dienst die API-Clientbibliothek von Google verwendet und 500, 502, 503 oder 504 zurückgibt, wiederholt die Directory API den Vorgang mit exponentiellem Backoff. Jeder andere Rückgabestatuscode gilt als Nachrichtenfehler.

Benachrichtigungen deaktivieren

Mit der Eigenschaft expiration wird festgelegt, wann die Benachrichtigungen automatisch beendet werden. Wenn du keine Benachrichtigungen mehr für einen bestimmten Kanal mehr erhalten möchtest, bevor er abläuft, kannst du die Methode stop unter dem folgenden URI aufrufen:

https://www.googleapis.com/admin/directory_v1/channels/stop

Für diese Methode müssen Sie mindestens die Attribute id und resourceId des Kanals angeben, wie im Beispiel unten gezeigt. Wenn die Directory API mehrere Ressourcentypen mit watch-Methoden hat, gibt es nur eine stop-Methode.

Nur Nutzer mit der entsprechenden Berechtigung können einen Kanal beenden. Wichtig ist insbesondere:

  • Wenn der Kanal von einem regulären Nutzerkonto erstellt wurde, kann nur der Nutzer, der den Kanal erstellt hat, über denselben Client (wie durch die OAuth 2.0-Client-IDs der Authentifizierungstokens identifiziert) den Kanal beenden.
  • Wenn der Kanal von einem Dienstkonto erstellt wurde, kann jeder Nutzer desselben Clients ihn beenden.

Das folgende Codebeispiel zeigt, wie Sie keine Benachrichtigungen mehr erhalten:

POST https://www.googleapis.com/admin/directory_v1/channels/stop
  
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66",
  "resourceId": "ret08u3rv24htgh289g"
}