Notifiche push

Questo documento descrive come utilizzare le notifiche push che informano la tua applicazione quando una risorsa viene modificata.

Panoramica

L'API Directory fornisce notifiche push che consentono di monitorare le modifiche alle risorse. Puoi utilizzare questa funzionalità per migliorare le prestazioni della tua applicazione. Consente di eliminare i costi aggiuntivi di rete e di calcolo associati alle risorse di polling per determinare se sono cambiate. Ogni volta che una risorsa controllata viene modificata, l'API Directory invia una notifica all'applicazione.

Per utilizzare le notifiche push, devi fare due cose:

  • Configura l'URL di ricezione o il destinatario di callback "webhook".

    Questo è un server HTTPS che gestisce i messaggi di notifica dell'API che vengono attivati quando una risorsa viene modificata.

  • Configura un canale di notifica per ogni endpoint delle risorse che vuoi guardare.

    Un canale specifica le informazioni di routing per i messaggi di notifica. Come parte della configurazione del canale, devi identificare l'URL specifico in cui vuoi ricevere le notifiche. Ogni volta che la risorsa di un canale viene modificata, l'API Directory invia un messaggio di notifica come richiesta POST a quell'URL.

Attualmente, l'API Directory supporta le notifiche per le modifiche alla risorsa Users.

Crea canali di notifica

Per richiedere notifiche push, devi configurare un canale di notifica per ogni risorsa che vuoi monitorare. Dopo aver configurato i canali di notifica, l'API Directory informa la tua applicazione quando vengono modificate le risorse controllate.

Inviare richieste di visualizzazione

A ogni risorsa dell'API Watchable Directory è associato un metodo watch in un URI nel seguente formato:

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

Per configurare un canale di notifica per i messaggi relativi alle modifiche apportate a una determinata risorsa, invia una richiesta POST al metodo watch per la risorsa.

Ogni canale di notifica è associato a un determinato utente e a una determinata risorsa (o insieme di risorse). Una richiesta watch non avrà esito positivo se l'utente o l'account di servizio attuale non possiede o dispone dell'autorizzazione per accedere a questa risorsa.

Esempi

Tutte le richieste di smartwatch per la risorsa User per un singolo dominio hanno il formato generale:

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

Utilizza i parametri domain e event per specificare il dominio e il tipo di evento per cui vuoi ricevere le notifiche.

Tutte le richieste di smartwatch per la risorsa utente per un cliente hanno il formato generale:

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

Utilizza i parametri customer e event per specificare l'ID univoco dell'Account Google del cliente e il tipo di evento per cui vuoi ricevere le notifiche.

I valori possibili per event sono:

  • add: evento creato dall'utente
  • delete: evento eliminato dall'utente
  • makeAdmin: evento di modifica dello stato dell'amministratore utente
  • undelete: evento di annullamento dell'eliminazione utente
  • update: evento aggiornato utente

Nota:per chiarezza, nei seguenti esempi viene omesso il corpo della richiesta.

Cerca gli eventi creati dall'utente per il dominio mydomain.com:

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

Controlla gli eventi creati dall'utente per il cliente my_customer:

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

Proprietà obbligatorie

Per ogni richiesta watch, devi compilare i seguenti campi:

  • Una stringa della proprietà id che identifica in modo univoco questo nuovo canale di notifica all'interno del progetto. Ti consigliamo di utilizzare un identificatore univoco universale (UUID) o una stringa univoca simile. Lunghezza massima: 64 caratteri.

    Il valore ID impostato viene riportato nell'intestazione HTTP X-Goog-Channel-Id di ogni messaggio di notifica che ricevi per questo canale.

  • Una stringa della proprietà type impostata sul valore web_hook.

  • Una stringa della proprietà address impostata sull'URL che ascolta e risponde alle notifiche per questo canale di notifica. Questo è l'URL di callback del webhook e deve utilizzare HTTPS.

    Tieni presente che l'API Directory è in grado di inviare notifiche a questo indirizzo HTTPS solo se sul tuo server web è installato un certificato SSL valido. I certificati non validi includono:

    • Certificati autofirmati.
    • Certificati firmati da una fonte non attendibile.
    • Certificati revocati.
    • Certificati con un oggetto che non corrisponde al nome host di destinazione.

Proprietà facoltative

Puoi anche specificare questi campi facoltativi con la tua richiesta watch:

  • Una proprietà token che specifica un valore stringa arbitrario da utilizzare come token di canale. Puoi utilizzare i token del canale di notifica per vari scopi. Ad esempio, puoi utilizzare il token per verificare che ogni messaggio in arrivo sia per un canale creato dall'applicazione, per assicurarti che la notifica non sia oggetto di spoofing, oppure per indirizzare il messaggio alla destinazione corretta all'interno della tua applicazione in base allo scopo di questo canale. Lunghezza massima: 256 caratteri.

    Il token è incluso nell'intestazione HTTP X-Goog-Channel-Token di ogni messaggio di notifica che la tua applicazione riceve per questo canale.

    Se utilizzi i token del canale di notifica, ti consigliamo di:

    • Utilizza un formato di codifica estensibile, ad esempio i parametri di query dell'URL. Esempio: forwardTo=hr&createdBy=mobile

    • Non includere dati sensibili come token OAuth.

  • Una stringa della proprietà expiration impostata su un timestamp Unix (in millisecondi) della data e dell'ora in cui vuoi che l'API Directory interrompa l'invio di messaggi per questo canale di notifica.

    Se un canale ha una data di scadenza, viene incluso come valore dell'intestazione HTTP X-Goog-Channel-Expiration (in formato leggibile) in ogni messaggio di notifica ricevuto dall'applicazione per questo canale.

Per maggiori dettagli sulla richiesta, consulta il metodo watch per la risorsa Users nel riferimento API.

Guarda la risposta

Se la richiesta watch crea correttamente un canale di notifica, viene restituito un codice di stato HTTP 200 OK.

Il corpo del messaggio della risposta dello smartwatch fornisce informazioni sul canale di notifica che hai appena creato, come mostrato nell'esempio di seguito.

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

Oltre alle proprietà che hai inviato nell'ambito della richiesta, le informazioni restituite includono anche resourceId e resourceUri per identificare la risorsa guardata su questo canale di notifica.

Puoi passare le informazioni restituite ad altre operazioni del canale di notifica, ad esempio quando vuoi interrompere la ricezione delle notifiche.

Per maggiori dettagli sulla risposta, consulta il metodo watch per la risorsa Users nel riferimento API.

Sincronizza messaggio

Dopo aver creato un canale di notifica per guardare una risorsa, l'API Directory invia un messaggio sync per indicare che le notifiche vengono avviate. Il valore dell'intestazione HTTP X-Goog-Resource-State per questi messaggi è sync. A causa di problemi di rete, è possibile ricevere il messaggio sync anche prima di ricevere la risposta del metodo watch.

Puoi ignorare la notifica sync, ma puoi usarla. Ad esempio, se decidi di non voler mantenere il canale, puoi utilizzare i valori X-Goog-Channel-ID e X-Goog-Resource-ID in una chiamata per interrompere la ricezione delle notifiche. Puoi anche utilizzare la notifica sync per eseguire alcune inizializzazioni e prepararti per gli eventi successivi.

Di seguito è mostrato il formato dei messaggi sync che l'API Directory invia all'URL di destinazione.

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

I messaggi di sincronizzazione hanno sempre un valore di intestazione HTTP X-Goog-Message-Number pari a 1. Ogni notifica successiva per questo canale ha un numero di messaggi maggiore della precedente, anche se i numeri dei messaggi non saranno sequenziali.

Rinnova canali di notifica

Un canale di notifica può avere una data di scadenza, con un valore determinato dalla tua richiesta o da eventuali limiti interni o predefiniti dell'API Directory (viene utilizzato il valore più restrittivo). La data di scadenza del canale, se presente, viene inclusa come timestamp Unix (in millisecondi) nelle informazioni restituite dal metodo watch. Inoltre, la data e l'ora di scadenza sono incluse (in formato leggibile) in ogni messaggio di notifica ricevuto dall'applicazione per questo canale nell'intestazione HTTP X-Goog-Channel-Expiration.

Al momento, non esiste un modo automatico per rinnovare un canale di notifica. Quando un canale è vicino alla scadenza, devi sostituirlo con uno nuovo richiamando il metodo watch. Come sempre, devi utilizzare un valore univoco per la proprietà id del nuovo canale. Tieni presente che potrebbe verificarsi un periodo di tempo di "sovrapposizione" in cui i due canali di notifica per la stessa risorsa sono attivi.

Ricezione notifiche

Ogni volta che una risorsa controllata viene modificata, l'applicazione riceve un messaggio di notifica che descrive la modifica. L'API Directory invia questi messaggi come richieste POST HTTPS all'URL specificato come proprietà address per questo canale di notifica.

Interpretare il formato dei messaggi di notifica

Tutti i messaggi di notifica includono un insieme di intestazioni HTTP con prefissi X-Goog-. Alcuni tipi di notifiche possono includere anche un corpo del messaggio.

Intestazioni

I messaggi di notifica pubblicati dall'API Directory nell'URL di destinazione includono le seguenti intestazioni HTTP:

Titolo Descrizione
Sempre presente
X-Goog-Channel-ID UUID o altra stringa univoca che hai fornito per identificare questo canale di notifica.
X-Goog-Message-Number Numero intero che identifica questo messaggio per questo canale di notifica. Il valore è sempre 1 per i messaggi sync. Il numero dei messaggi aumenta per ogni messaggio successivo sul canale, ma non è sequenziale.
X-Goog-Resource-ID Un valore opaco che identifica la risorsa controllata. Questo ID è stabile in tutte le versioni dell'API.
X-Goog-Resource-State Il nuovo stato della risorsa che ha attivato la notifica. Valori possibili: sync o un nome evento.
X-Goog-Resource-URI Un identificatore specifico della versione dell'API per la risorsa monitorata.
A volte presente
X-Goog-Channel-Expiration Data e ora di scadenza del canale di notifica, espresse in formato leggibile. Presente solo se definito.
X-Goog-Channel-Token Token del canale di notifica impostato dalla tua applicazione e che puoi utilizzare per verificare l'origine della notifica. Presente solo se definito.

I messaggi di notifica per gli utenti contengono le seguenti informazioni nel corpo della richiesta:

Proprietà Descrizione
kind Identifica come risorsa utente. Valore: la stringa fissa "admin#directory#user".
id Identificatore univoco della risorsa utente.
etag ETag del messaggio di notifica. Diverso dall'ETag della risorsa utente.
primaryEmail L'indirizzo email principale dell'utente.

Esempi

I messaggi di notifica per User eventi della risorsa hanno il formato generale:

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
}

Esempio di evento eliminato da un utente:

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

Risposta alle notifiche

Per indicare l'esito positivo, puoi restituire uno dei seguenti codici di stato: 200, 201, 202, 204 o 102.

Se il tuo servizio utilizza la libreria client delle API di Google e restituisce 500,502, 503 o 504, l'API Directory esegue un nuovo tentativo con un backoff esponenziale. Ogni altro codice di stato restituito è considerato un messaggio non riuscito.

Notifiche di arresto

La proprietà expiration controlla quando le notifiche si interrompono automaticamente. Puoi scegliere di interrompere la ricezione delle notifiche per un determinato canale prima che scada, chiamando il metodo stop al seguente URI:

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

Questo metodo richiede almeno le proprietà id e resourceId del canale, come mostrato nell'esempio riportato di seguito. Tieni presente che se l'API Directory ha diversi tipi di risorse con metodi watch, esiste un solo metodo stop.

Solo gli utenti con l'autorizzazione appropriata possono interrompere un canale. In particolare:

  • Se il canale è stato creato da un normale account utente, solo lo stesso utente dello stesso client (identificato dagli ID client OAuth 2.0 dei token di autorizzazione) che ha creato il canale può arrestare il canale.
  • Se il canale è stato creato da un account di servizio, qualsiasi utente dello stesso client può arrestare il canale.

Il seguente esempio di codice mostra come interrompere la ricezione delle notifiche:

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