Powiadomienia push

W tym dokumencie opisujemy, jak korzystać z powiadomień push informujących aplikację o zmianie zasobu.

Przegląd

Interfejs Directory API udostępnia powiadomienia push, które umożliwiają monitorowanie zmian w zasobach. Dzięki tej funkcji możesz zwiększyć wydajność swojej aplikacji. Pozwala wyeliminować dodatkowe koszty sieci i obliczeniowe związane z zasobami odpytywania w celu określenia, czy się zmieniły. Po każdej zmianie obserwowanego zasobu interfejs Directory API powiadamia aplikację.

Aby korzystać z powiadomień push, musisz zrobić 2 rzeczy:

  • Skonfiguruj adres URL odbierania lub odbiornik wywołania zwrotnego „webhooka”.

    Jest to serwer HTTPS obsługujący komunikaty z powiadomieniami interfejsu API, które są aktywowane po zmianie zasobu.

  • Skonfiguruj kanał powiadomień dla każdego punktu końcowego zasobu, który chcesz oglądać.

    Kanał określa informacje dotyczące routingu wiadomości z powiadomieniami. Podczas konfigurowania kanału musisz określić adres URL, na który chcesz otrzymywać powiadomienia. Przy każdej zmianie zasobu kanału interfejs Directory API wysyła na ten adres URL wiadomość z powiadomieniem jako żądanie POST.

Obecnie interfejs Directory API obsługuje powiadomienia o zmianach w zasobie Users.

Tworzenie kanałów powiadomień

Aby wysyłać żądania powiadomień push, musisz skonfigurować kanał powiadomień dla każdego zasobu, który chcesz monitorować. Po skonfigurowaniu kanałów powiadomień interfejs Directory API informuje Twoją aplikację o zmianach w obserwowanych zasobach.

Wysyłaj prośby o zegarek

Każdy dostępny do obejrzenia zasób interfejsu Directory API ma powiązaną metodę watch z identyfikatorem URI w następującym formacie:

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

Aby skonfigurować kanał powiadomień dla wiadomości o zmianach w określonym zasobie, wyślij żądanie POST do metody watch tego zasobu.

Każdy kanał powiadomień jest powiązany zarówno z konkretnym użytkownikiem, jak i z konkretnym zasobem (lub zbiorem zasobów). Żądanie watch nie zostanie zrealizowane, chyba że bieżący użytkownik lub konto usługi jest właścicielem zasobu lub ma uprawnienia dostępu do niego.

Przykłady

Wszystkie żądania oglądania dotyczące zasobu User w jednej domenie mają postać ogólną:

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.
  }
}

Użyj parametrów domain i event, aby określić domenę i typ zdarzenia, o którym chcesz otrzymywać powiadomienia.

Wszystkie żądania zegarka dotyczące zasobu użytkownika w przypadku klienta mają postać ogólną:

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.
  }
}

Użyj parametrów customer i event, aby określić unikalny identyfikator konta Google klienta oraz typ zdarzenia, o którym chcesz otrzymywać powiadomienia.

Możliwe wartości pola event:

  • add: zdarzenie utworzone przez użytkownika
  • delete: wydarzenie usunięte przez użytkownika
  • makeAdmin: zdarzenie zmiany stanu administratora użytkowników
  • undelete: użytkownik przywrócił wydarzenie
  • update: użytkownik zaktualizował zdarzenie

Uwaga: dla jasności w poniższych przykładach pominięto treść żądania.

Oglądaj zdarzenia utworzone przez użytkowników dla domeny mydomain.com:

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

Obejrzyj zdarzenia utworzone przez użytkowników dla klienta my_customer:

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

Właściwości wymagane

W przypadku każdego żądania watch musisz wypełnić te pola:

  • Ciąg właściwości id jednoznacznie identyfikujący nowy kanał powiadomień w projekcie. Zalecamy użycie unikalnego identyfikatora uniwersalnego (UUID) lub podobnego unikalnego ciągu znaków. Maksymalna długość: 64 znaki.

    Ustawiona wartość identyfikatora jest powtarzana w nagłówku HTTP X-Goog-Channel-Id każdej wiadomości powiadomienia otrzymanej w związku z danym kanałem.

  • Ciąg tekstowy właściwości type ustawiony na wartość web_hook.

  • Ciąg właściwości address ustawiony na URL, który nasłuchuje i odpowiada na powiadomienia z tego kanału powiadomień. To jest adres URL wywołania zwrotnego webhooka, który musi używać protokołu HTTPS.

    Pamiętaj, że interfejs Directory API może wysyłać powiadomienia na ten adres HTTPS tylko wtedy, gdy na serwerze WWW jest zainstalowany prawidłowy certyfikat SSL. Nie prawidłowe certyfikaty to między innymi:

    • podpisane samodzielnie,
    • podpisane przez niezaufane źródło,
    • unieważnione.
    • Certyfikaty z podmiotem niezgodnym z docelową nazwą hosta.

Właściwości opcjonalne

W żądaniu watch możesz też określić te opcjonalne pola:

  • Właściwość token, która określa wartość dowolnego ciągu znaków do użycia jako token kanału. Tokenów kanałów powiadomień możesz używać do różnych celów. Możesz na przykład użyć tokena, aby sprawdzić, czy każda wiadomość przychodząca jest przeznaczona dla kanału utworzonego przez Twoją aplikację (aby upewnić się, że powiadomienie nie jest próbą podszywania się) lub aby przekierować wiadomość do właściwego miejsca w aplikacji na podstawie przeznaczenia tego kanału. Maksymalna długość: 256 znaków.

    Token znajduje się w nagłówku HTTP X-Goog-Channel-Token w każdej wiadomości powiadomienia, którą aplikacja otrzymuje dla tego kanału.

    Jeśli używasz tokenów kanału powiadomień, zalecamy wykonanie tych czynności:

    • Użyj rozszerzonego formatu kodowania, np. parametrów zapytania w adresie URL. Przykład: forwardTo=hr&createdBy=mobile

    • Nie podawaj danych wrażliwych, takich jak tokeny OAuth.

  • Ciąg właściwości expiration ustawiony na sygnaturę czasową uniksową (w milisekundach) daty i godziny, kiedy interfejs Directory API ma przestać wysyłać komunikaty z tego kanału powiadomień.

    Jeśli kanał ma określony czas ważności, jest on podawany jako wartość nagłówka HTTP X-Goog-Channel-Expiration (w formacie zrozumiałym dla człowieka) w każdej wiadomości z powiadomieniem otrzymywanej przez aplikację dla tego kanału.

Więcej informacji o tym żądaniu znajdziesz w opisie metody watch dotyczącej zasobu Users w dokumentacji interfejsu API.

Obejrzyj odpowiedź

Jeśli żądanie watch utworzy kanał powiadomień, zwróci kod stanu HTTP 200 OK.

Treść wiadomości odpowiedzi zegarka zawiera informacje o nowo utworzonym kanale powiadomień, jak pokazano w poniższym przykładzie.

{
  "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.
}

Oprócz właściwości wysłanych w ramach żądania zwrócone informacje obejmują też resourceId i resourceUri pozwalające zidentyfikować zasób, który chcesz obserwować w tym kanale powiadomień.

Możesz przekazać zwrócone informacje do innych operacji w kanale powiadomień, na przykład kiedy chcesz przestać otrzymywać powiadomienia.

Więcej informacji o odpowiedzi znajdziesz w opisie metody watch dotyczącej zasobu Users w dokumentacji interfejsu API.

Synchronizuj wiadomość

Gdy utworzysz kanał powiadomień w celu obserwowania zasobu, interfejs Directory API wysyła komunikat sync informujący o rozpoczęciu powiadomień. Wartość nagłówka HTTP X-Goog-Resource-State dla tych wiadomości to sync. Ze względu na problemy z czasem sieci możesz otrzymać komunikat sync jeszcze przed otrzymaniem odpowiedzi metody watch.

Możesz bezpiecznie zignorować powiadomienie sync, ale możesz też z niego skorzystać. Jeśli na przykład zdecydujesz, że nie chcesz zachować kanału, możesz użyć wartości X-Goog-Channel-ID i X-Goog-Resource-ID w wywołaniu, aby przestać otrzymywać powiadomienia. Możesz też użyć powiadomienia sync, aby przeprowadzić inicjalizację, aby przygotować się na późniejsze zdarzenia.

Poniżej znajdziesz format wiadomości sync, które interfejs Directory API wysyła na adres URL odbiorcy.

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

Wiadomości synchronizacji mają zawsze wartość nagłówka HTTP X-Goog-Message-Number o wartości 1. Każde kolejne powiadomienie z tego kanału ma numer wiadomości większy od poprzedniego, przy czym numery wiadomości nie są ułożone kolejne.

Odnów kanały powiadomień

Kanał powiadomień może mieć czas wygaśnięcia. Jego wartość zależy od żądania albo dowolnych wewnętrznych limitów interfejsu Directory API lub wartości domyślnych (stosowana jest bardziej restrykcyjna wartość). Czas wygaśnięcia kanału, jeśli go ma, jest podawany jako sygnatura czasowa uniksowa (w milisekundach) w informacjach zwracanych przez metodę watch. Dodatkowo data i godzina wygaśnięcia są podawane (w formacie czytelnym dla człowieka) w każdej wiadomości powiadomienia odbieranej przez aplikację dla danego kanału w nagłówku HTTP X-Goog-Channel-Expiration.

Obecnie nie ma możliwości automatycznego odnowienia kanału powiadomień. Gdy kanał zbliża się do wygaśnięcia, musisz zastąpić go nowym, wywołując metodę watch. Jak zawsze musisz użyć unikalnej wartości właściwości id nowego kanału. Zwróć uwagę, że w przypadku aktywnych kanałów powiadomień dotyczących tego samego zasobu może wystąpić okres „nakładanie się”.

Odbieranie powiadomień

Po każdej zmianie obserwowanego zasobu aplikacja otrzyma powiadomienie z opisem tej zmiany. Interfejs Directory API wysyła te wiadomości jako żądania HTTPS POST na adres URL podany jako właściwość address dla tego kanału powiadomień.

Interpretowanie formatu wiadomości z powiadomieniem

Wszystkie wiadomości z powiadomieniami zawierają zestaw nagłówków HTTP z prefiksami X-Goog-. Niektóre typy powiadomień mogą też zawierać treść wiadomości.

nagłówków,

Wiadomości z powiadomieniami publikowane przez interfejs Directory API na docelowym adresie URL mają te nagłówki HTTP:

Nagłówek Opis
Zawsze obecne
X-Goog-Channel-ID Identyfikator UUID lub inny unikalny ciąg podany przez Ciebie, aby zidentyfikować ten kanał powiadomień.
X-Goog-Message-Number Liczba całkowita identyfikująca tę wiadomość w kanale powiadomień. W przypadku sync wiadomości wartość to zawsze 1. Każda kolejna wiadomość na kanale zwiększa liczbę wiadomości, ale nie jedna po drugiej.
X-Goog-Resource-ID Nieprzejrzysta wartość identyfikująca obserwowany zasób. Ten identyfikator jest stabilny we wszystkich wersjach interfejsu API.
X-Goog-Resource-State Nowy stan zasobu, który wywołał powiadomienie. Możliwe wartości: sync lub nazwa zdarzenia.
X-Goog-Resource-URI Identyfikator wersji interfejsu API obserwowanego zasobu.
Czasami obecne
X-Goog-Channel-Expiration Data i godzina wygaśnięcia kanału powiadomień podane w formacie zrozumiałym dla człowieka. Widoczny tylko wtedy, gdy został zdefiniowany.
X-Goog-Channel-Token Token kanału powiadomień ustawiony przez Twoją aplikację, którego możesz użyć do zweryfikowania źródła powiadomień. Widoczny tylko wtedy, gdy został zdefiniowany.

Wiadomości z powiadomieniami dla użytkowników zawierają w treści żądania te informacje:

Właściwość Opis
kind Identyfikuje go jako zasób użytkownika. Wartość: ustalony ciąg znaków „admin#directory#user”.
id Unikalny identyfikator zasobu użytkownika.
etag ETag wiadomości z powiadomieniem. Różni się od ETag zasobu User.
primaryEmail Podstawowy adres e-mail użytkownika.

Przykłady

Powiadomienia o zdarzeniach związanych z zasobem User mają postać ogólną:

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
}

Przykładowe zdarzenie usunięcia użytkownika:

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"
}

Odpowiedz na powiadomienia

Aby pokazać, że powodzenie, możesz zwrócić dowolny z tych kodów stanu: 200, 201, 202, 204 lub 102.

Jeśli Twoja usługa korzysta z biblioteki klienta interfejsu API Google i zwraca 500, 502, 503 lub 504, interfejs Directory API ponawia próbę z wykładniczym ponawianiem. Każdy inny kod stanu zwrotu jest uznawany za niepowodzenie wiadomości.

Zatrzymaj powiadomienia

Właściwość expiration określa, kiedy powiadomienia mają się automatycznie zatrzymać. Możesz zrezygnować z otrzymywania powiadomień z konkretnego kanału, zanim straci ważność, wywołując metodę stop pod tym identyfikatorem URI:

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

Ta metoda wymaga podania co najmniej właściwości id i resourceId kanału, jak pokazano w poniższym przykładzie. Pamiętaj, że jeśli interfejs Directory API ma kilka typów zasobów z metodami watch, istnieje tylko jedna metoda stop.

Tylko użytkownicy z odpowiednimi uprawnieniami mogą zablokować kanał. W szczególności:

  • Jeśli kanał został utworzony przy użyciu zwykłego konta użytkownika, tylko ten sam użytkownik tego samego klienta (identyfikowany za pomocą identyfikatorów klienta OAuth 2.0 w tokenach uwierzytelniania), który utworzył kanał, może go zatrzymać.
  • Jeśli kanał został utworzony przy użyciu konta usługi, może go zatrzymać każdy użytkownik korzystający z tego samego klienta.

Z tego przykładowego kodu dowiesz się, jak przestać otrzymywać powiadomienia:

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"
}