Powiadomienia push

W tym dokumencie opisujemy, jak używać powiadomień push, które informują aplikację o zmianie zasobu.

Przegląd

Interfejs Admin SDK API zapewnia powiadomienia push, które pozwalają obserwować zmiany w zasobach. Możesz użyć tej funkcji, aby zwiększyć wydajność aplikacji. Pozwala to wyeliminować dodatkowe koszty sieci i mocy obliczeniowej związane z zasobami odpytywania w celu określenia, czy uległy zmianie. Za każdym razem, gdy zmieni się obserwowany zasób, interfejs Admin SDK API powiadomi Twoją aplikację.

Aby używać powiadomień push, musisz wykonać 2 rzeczy:

  • Skonfiguruj docelowy adres URL lub odbiornik poczty internetowej.

    To serwer HTTPS, który obsługuje komunikaty powiadomień interfejsu API wywoływane po zmianie zasobu.

  • Skonfiguruj kanał powiadomień dla każdego punktu końcowego zasobów, który chcesz obejrzeć.

    Kanał określa informacje o routingu wiadomości z powiadomieniami. W ramach konfiguracji kanału określasz adres URL, na który chcesz otrzymywać powiadomienia. Za każdym razem, gdy zasób zasobu się zmieni, interfejs Admin SDK API wyśle powiadomienie w postaci żądania POST na ten adres URL.

Obecnie interfejs Admin SDK API obsługuje powiadomienia o zmianach w zasobie Aktywności.

Tworzenie kanałów powiadomień

Aby żądać powiadomień push, musisz skonfigurować kanał powiadomień dla każdego zasobu, który chcesz oglądać. Gdy skonfigurujesz kanały powiadomień, interfejs Admin SDK API poinformuje Twoją aplikację o każdej zmianie zasobu.

Zgłaszanie próśb o obejrzenie

Z każdym dostępnym do oglądania zasobami interfejsu Admin SDK API powiązana jest metoda watch z identyfikatorem URI takiej formy:

https://www.googleapis.com/apiName/apiVersion/resourcePath/watch

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

Każdy kanał powiadomień jest powiązany z konkretnym użytkownikiem i określonym zasobem (lub zbiorem zasobów). Żądanie watch nie zostanie zrealizowane, jeśli bieżący użytkownik lub konto usługi nie będą właścicielami lub dostępem do tego zasobu.

Przykłady

Wszystkie żądania zegarka dotyczące zasobu aktywności mają ogólny format:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/userKey or all/applications/applicationName/watch
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.
  "payload": true, // (Optional) Whether to include the payload (message body) in notifications.
  "expiration": 3600 // (Optional) Your requested channel expiration time.
}

Za pomocą parametrów userKey, applicationName, eventName i filters możesz otrzymywać powiadomienia tylko o określonych zdarzeniach, użytkownikach lub aplikacjach.

Uwaga: w poniższych przykładach żądanie jest niejasne.

Przeglądanie wszystkich czynności administracyjnych:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin/watch

Wszystkie działania dotyczące dokumentów:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/docs/watch

Aktywność określonego administratora w przypadku określonego użytkownika:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/liz@example.com/applications/admin/watch

Czekaj na określone zdarzenie, na przykład zmianę hasła użytkownika:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin/watch?eventName=CHANGE_PASSWORD

Sprawdź zmiany w konkretnym dokumencie:

POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/docs/watch?eventName=EDIT&filters==doc_id=123456abcdef

Właściwości wymagane

W przypadku każdego żądania watch musisz podać:

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

    Ustawiona wartość identyfikatora jest odczytywana w nagłówku X-Goog-Channel-Id każdej wiadomości z powiadomieniem dotyczącej tego kanału.

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

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

    Pamiętaj, że interfejs Admin SDK API będzie mógł wysyłać powiadomienia na ten adres HTTPS tylko wtedy, gdy na serwerze WWW jest zainstalowany ważny certyfikat SSL. Nie prawidłowe certyfikaty to między innymi:

    • podpisane samodzielnie,
    • podpisane przez niezaufane źródło,
    • unieważnione.
    • Certyfikaty o charakterze zgodnym z nazwą hosta docelowego.

Właściwości opcjonalne

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

  • Właściwość token, która określa dowolną wartość ciągu znaków, który ma być używany jako token kanału. Tokenów kanału powiadomień można używać do różnych celów. Na przykład możesz użyć tokena, aby sprawdzić, czy każda wiadomość przychodzących pochodzi z kanału utworzonego przez aplikację, dzięki czemu powiadomienie nie będzie sfałszowane, lub aby kierować wiadomość do odpowiedniego miejsca docelowego w aplikacji na podstawie celu tego kanału. Maksymalna długość: 256 znaków.

    Token znajduje się w nagłówku HTTP X-Goog-Channel-Token każdej wiadomości z powiadomieniem, którą otrzymuje Twój kanał.

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

    • Użyj elastycznego formatu kodowania, takiego jak parametry zapytania z adresu 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 sygnatura czasowa Unix (w ms) daty i godziny, kiedy interfejs Admin SDK API ma przestać wysyłać wiadomości dla tego kanału powiadomień.

    Jeśli czas trwania kanału jest określony, zostanie on uwzględniony jako wartość nagłówka HTTP X-Goog-Channel-Expiration (tym razem w postaci zrozumiałej dla człowieka) w każdym powiadomieniu wysyłanym do aplikacji przez ten kanał.

Więcej informacji o żądaniu znajdziesz w metodzie watch zasobu Aktywności w dokumentacji API.

Obserwuj odpowiedź

Jeśli żądanie watch utworzy kanał powiadomień, będzie zwracać kod stanu HTTP 200 OK.

Treść wiadomości z odpowiedzi na zegarek zawiera informacje o stworzeniu właśnie utworzonego kanału powiadomień (przykład poniżej).

{
  "kind": "api#channel",
  "id": "reportsApiId", // ID you specified for this channel.
  "resourceId": "o3hgv1538sdjfh", // ID of the watched resource.
  "resourceUri": "https://admin.googleapis.com/admin/reports/v1/activity/userKey/applications/applicationName", // Version-specific ID of the watched resource.
  "token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
  "expiration": 3600, // Actual expiration time as Unix timestamp (in ms), if applicable.
}

Oprócz właściwości wysłanych w ramach żądania, zwracane informacje obejmują też resourceId i resourceUri, które wskazują zasób wyświetlany w tym kanale powiadomień.

Te informacje możesz przekazywać do innych operacji związanych z kanałami powiadomień, na przykład wtedy, gdy chcesz przestać otrzymywać powiadomienia.

Więcej informacji o odpowiedzi znajdziesz w metodzie watch dotyczącej zasobu Aktywności w dokumentacji API.

Synchronizuj wiadomość

Gdy utworzysz nowy kanał powiadomień, żeby obejrzeć zasób, interfejs Admin SDK API wyśle komunikat sync z informacją o rozpoczęciu powiadomień. Wartość nagłówka HTTP X-Goog-Resource-State tych wiadomości to sync. Ze względu na problemy z czasem sieciowym może się zdarzyć, że otrzymasz wiadomość sync, jeszcze zanim otrzymasz odpowiedź metody watch.

Możesz zignorować powiadomienie sync, ale możesz z niego skorzystać. Jeśli na przykład postanowisz nie zachowywać kanału, możesz użyć wartości X-Goog-Channel-ID i X-Goog-Resource-ID w wywołaniu, aby wyłączyć powiadomienia. Możesz też użyć powiadomienia sync, aby przeprowadzić inicjację na potrzeby przyszłych zdarzeń.

Format wiadomości sync wysyłanych przez interfejs Admin SDK API na adres docelowy jest widoczny poniżej.

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 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 równą 1. Każde kolejne powiadomienie z tego kanału będzie mieć numer wiadomości wyższy od poprzedniego, ale numery wiadomości nie będą sekwencyjne.

Odnawianie kanałów powiadomień

Kanał powiadomień może mieć okres ważności, którego wartość jest określana na podstawie żądania albo wewnętrznych limitów lub domyślnych interfejsów Admin SDK API (używana jest bardziej restrykcyjna wartość). Czas wygaśnięcia kanału (jeśli go ma) jest podany jako sygnatura czasowa Unix (w ms) w informacjach zwracanych przez metodę watch. Dodatkowo data i godzina wygaśnięcia (w formacie czytelnym dla człowieka) jest podana w nagłówku HTTP X-Goog-Channel-Expiration w powiadomieniach, które aplikacja otrzymuje w związku z danym kanałem.

Obecnie nie ma możliwości automatycznego odnawiania kanału powiadomień. Gdy zbliża się data wygaśnięcia ważności kanału, musisz utworzyć nowy, wywołując metodę watch. Jak zawsze musisz użyć unikalnej wartości właściwości id nowego kanału. Pamiętaj, że okres aktywności obu kanałów powiadomień dotyczących tego samego zasobu może być okresu.

Odbieranie powiadomień

Za każdym razem, gdy zmieni się obserwowany zasób, aplikacja otrzyma powiadomienie z opisem zmiany. Interfejs Admin SDK API wysyła te wiadomości jako żądania HTTPS POST na adres URL podany jako "address" dla tego kanału powiadomień.

Omówienie formatu wiadomości z powiadomieniem

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

Nagłówki

Wiadomości z powiadomieniami publikowane przez interfejs Admin SDK API na adres URL odbiorcy zawierają te nagłówki HTTP:

Nagłówek Opis
Zawsze dostępne
X-Goog-Channel-ID Identyfikator UUID lub inny unikalny ciąg znaków podany przez Ciebie do zidentyfikowania tego kanału powiadomień.
X-Goog-Message-Number Liczba całkowita, która identyfikuje tę wiadomość w przypadku tego kanału powiadomień. Wartość w przypadku sync wiadomości wynosi 1. Liczba wiadomości wzrasta w przypadku każdej kolejnej wiadomości na kanale, ale nie są one sekwencyjne.
X-Goog-Resource-ID Nieprzezroczysta wartość identyfikująca oglądany zasób. Ten identyfikator jest stały w przypadku wersji 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 specyficzny dla interfejsu API dla obserwowanego zasobu.
Czasami występuje
X-Goog-Channel-Expiration Data i godzina wygaśnięcia kanału powiadomień podana w postaci zrozumiałej dla człowieka. Wartość dostępna tylko wtedy, gdy jest zdefiniowana.
X-Goog-Channel-Token Token kanału powiadomień ustawiony przez Twoją aplikację, którego możesz używać do weryfikowania źródła powiadomień. Jest obecny tylko wtedy, gdy jest zdefiniowany.

Treść powiadomień dotyczących działań zawiera te informacje w treści żądania:

Właściwość Opis
kind Określa to jako zasób aktywności. Wartość: stały ciąg "admin#reports#activity".
id Unikalny identyfikator rekordu aktywności.
id.time Czas wystąpienia aktywności. Wartość powinna być w formacie ISO 8601. Godzina jest pełną datą oraz godzinami, minutami i sekundami w formacie RRRR-MM-DDTgg:mm:ssTZD. np. 2010-04-05T17:30:04+01:00.
id.uniqueQualifier Unikalny kwalifikator, jeśli wiele zdarzeń ma ten sam czas.
id.applicationName Nazwa aplikacji, do której należy zdarzenie. Możliwe wartości:
id.customerId Niepowtarzalny identyfikator konta Google Workspace.
actor Użytkownik wykonuje działanie.
actor.callerType Typ autora, który wykonał działanie widoczne w raporcie. W tym interfejsie interfejsu API callerType jest żądaniem USER lub OAuth 2LO, które wykonało działanie wymienione w raporcie .
actor.email Podstawowy adres e-mail użytkownika, którego działania są zgłaszane.
actor.profileId Unikalny identyfikator profilu użytkownika Google Workspace.
ownerDomain Domena konsoli administracyjnej lub właściciela dokumentu Dokumentów. Jest to domena, której dotyczy raport.
ipAddress Adres IP użytkownika wykonującego działanie. Jest to adres IP użytkownika podczas logowania się w Google Workspace, który może, ale nie musi, odzwierciedlać jego fizyczną lokalizację. Może to być na przykład adres serwera proxy użytkownika lub wirtualna sieć prywatna (VPN). Interfejs API obsługuje IPv4 i IPv6.
events[] Zdarzenia w raporcie.
events[].type Typ zdarzenia. Usługa lub funkcja Google Workspace, którą administrator zmieni, jest określana we właściwości type, która identyfikuje zdarzenie przy użyciu właściwości eventName.
events[].name Nazwa zdarzenia. To jest nazwa aktywności zgłaszanej przez interfejs API. Każda właściwość eventName jest powiązana z konkretną usługą lub funkcją Google Workspace, którą interfejs API dzieli na typy zdarzeń.
Ogólnie o parametrach żądań eventName:
  • Jeśli nie podano eventName, raport zwróci wszystkie możliwe wystąpienia eventName.
  • Gdy zażądasz eventName, odpowiedź interfejsu API zwróci wszystkie działania zawierające ten obiekt eventName. Możliwe, że zwrócone działania będą miały inne właściwości eventName niż żądana.
events[].parameters[] Pary wartości parametrów na potrzeby różnych aplikacji.
events[].parameters[].name Nazwa parametru.
events[].parameters[].value Wartość ciągu przypisana do parametru.
events[].parameters[].intValue Wartość w formie liczby całkowitej.
events[].parameters[].boolValue Wartość logiczna parametru.

Przykłady

Komunikaty o zdarzeniach dotyczących zasobu aktywności mają ogólny format:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: reportsApiId
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/reports/v1/activity/userKey/applications/applicationName
X-Goog-Resource-State:  eventName
X-Goog-Message-Number: 10

{
  "kind": "admin#reports#activity",
  "id": {
    "time": datetime,
    "uniqueQualifier": long,
    "applicationName": string,
    "customerId": string
  },
  "actor": {
    "callerType": string,
    "email": string,
    "profileId": long
  },
  "ownerDomain": string,
  "ipAddress": string,
  "events": [
    {
      "type": string,
      "name": string,
      "parameters": [
        {
          "name": string,
          "value": string,
          "intValue": long,
          "boolValue": boolean
        }
      ]
    }
  ]
}

Przykład zdarzenia aktywności administratora:

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 596
X-Goog-Channel-ID: reportsApiId
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Tue, 29 Oct 2013 20:32:02 GMT
X-Goog-Resource-ID:  ret987df98743md8g
X-Goog-Resource-URI: https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin?alt=json
X-Goog-Resource-State:  CREATE_USER
X-Goog-Message-Number: 23

{
  "kind": "admin#reports#activity",
  "id": {
    "time": "2013-09-10T18:23:35.808Z",
    "uniqueQualifier": "-0987654321",
    "applicationName": "admin",
    "customerId": "ABCD012345"
  },
  "actor": {
    "callerType": "USER",
    "email": "admin@example.com",
    "profileId": "0123456789987654321"
  },
  "ownerDomain": "apps-reporting.example.com",
  "ipAddress": "192.0.2.0",
  "events": [
    {
      "type": "USER_SETTINGS",
      "name": "CREATE_USER",
      "parameters": [
        {
          "name": "USER_EMAIL",
          "value": "liz@example.com"
        }
      ]
    }
  ]
}

Odpowiadanie na powiadomienia

Aby wskazać, że projekt zakończył się powodzeniem, możesz użyć dowolnego z tych kodów stanu: 200, 201, 202, 204 lub 102.

Jeśli Twoja usługa używa biblioteki klienta interfejsu API Google& Każdy inny kod stanu zwrotu jest uznawany za niepowodzenie wiadomości.

Zdarzenia dotyczące powiadomień w interfejsie Admin SDK API

Ta sekcja zawiera szczegółowe informacje na temat wiadomości, które możesz otrzymywać, gdy używasz powiadomień push za pomocą interfejsu Admin SDK API.

Powiadomienia push w interfejsie Reports API zawierają 2 rodzaje wiadomości: synchronizację i powiadomienia o zdarzeniach. Typ wiadomości jest podany w nagłówku HTTP X-Goog-Resource-State. Możliwe wartości powiadomień o zdarzeniach są takie same jak w przypadku metody activities.list. Każda aplikacja ma unikalne zdarzenia:

Zatrzymuję powiadomienia

Data ważności wygasa, gdy powiadomienia są zatrzymywane automatycznie. Możesz zrezygnować z otrzymywania powiadomień z danego kanału, zanim straci ważność, wywołując metodę stop za pomocą tego identyfikatora URI:

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

Ta metoda wymaga podania właściwości co najmniej id i właściwości resourceId, jak pokazano w poniższym przykładzie. Pamiętaj, że nawet jeśli interfejs Admin SDK API zawiera kilka typów zasobów z metodami watch, występuje tylko jedna metoda stop.

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

  • Jeżeli kanał został utworzony przez zwykłego użytkownika, może to powstrzymać tylko ten sam użytkownik (zgodnie z identyfikatorami klienta OAuth 2.0), który utworzył kanał.
  • Jeśli kanał został utworzony za pomocą konta usługi, wszyscy użytkownicy tego samego klienta mogą go zatrzymać.
POST https://www.googleapis.com/admin/reports_v1/channels/stop
  
Authorization: Bearer {auth_token_for_current_user}
Content-Type: application/json

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