Notificações push

Este documento descreve como usar notificações push que informam o app quando um recurso muda.

Visão geral

A API Directory oferece notificações push que permitem monitorar mudanças nos recursos. Você pode usar esse recurso para melhorar o desempenho do aplicativo. Ele permite eliminar os custos de rede e computação extras envolvidos na pesquisa de recursos para determinar se eles mudaram. Sempre que um recurso monitorado muda, a API Directory notifica seu aplicativo.

Para usar as notificações push, você precisa fazer duas coisas:

  • Configure o URL de recebimento ou o receptor de callback "webhook".

    Esse é um servidor HTTPS que processa as mensagens de notificação da API que são acionadas quando um recurso muda.

  • Configure um canal de notificação para cada endpoint de recurso que você quer monitorar.

    Um canal especifica informações de roteamento para mensagens de notificação. Como parte da configuração do canal, você precisa identificar o URL específico em que você quer receber notificações. Sempre que o recurso de um canal muda, a API Directory envia uma mensagem de notificação como uma solicitação POST para esse URL.

No momento, a API Directory oferece suporte a notificações para mudanças no recurso Users.

Criar canais de notificação

Para solicitar notificações push, configure um canal de notificação para cada recurso que você quer monitorar. Depois que os canais de notificação forem configurados, a API Directory vai informar o aplicativo quando qualquer recurso monitorado for alterado.

Fazer solicitações de relógio

Cada recurso da API Directory que pode ser assistido tem um método watch associado em um URI do seguinte formato:

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

Para configurar um canal de notificação para mensagens sobre mudanças em um recurso específico, envie uma solicitação POST para o método watch do recurso.

Cada canal de notificação é associado a um usuário específico e a um recurso (ou conjunto de recursos) específico. Uma solicitação watch só vai ser bem-sucedida se o usuário atual ou a conta de serviço tiver ou tiver permissão para acessar esse recurso.

Exemplos

Todas as solicitações de monitoramento do recurso User de um único domínio têm a forma geral:

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

Use os parâmetros domain e event para especificar o domínio e o tipo de evento para o qual você quer receber notificações.

Todas as solicitações de monitoramento do recurso "Usuário" de um cliente têm a seguinte forma geral:

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

Use os parâmetros customer e event para especificar o ID exclusivo da Conta do Google do cliente e o tipo de evento para o qual você quer receber notificações.

Os valores possíveis para event são:

  • add: evento criado pelo usuário
  • delete: evento de exclusão do usuário
  • makeAdmin: evento de mudança de status de administrador do usuário
  • undelete: evento de restauração de usuário
  • update: evento de atualização do usuário

Observação:os exemplos a seguir omitem o corpo da solicitação para maior clareza.

Confira os eventos criados pelo usuário para o domínio mydomain.com:

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

Observe os eventos criados pelo usuário para o cliente my_customer:

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

Propriedades obrigatórias

Com cada solicitação watch, é necessário informar estes campos:

  • Uma string de propriedade id que identifica exclusivamente esse novo canal de notificação no seu projeto. Recomendamos o uso de um identificador universal exclusivo (UUID) ou qualquer string exclusiva semelhante. Comprimento máximo: 64 caracteres.

    O valor do ID definido é repetido no cabeçalho HTTP X-Goog-Channel-Id de cada mensagem de notificação que você recebe para esse canal.

  • Uma string de propriedade type definida como o valor web_hook.

  • Uma string de propriedade address definida para o URL que detecta e responde a notificações para esse canal de notificação. Esse é o URL de callback do webhook, que precisa usar HTTPS.

    A API Directory só pode enviar notificações para este endereço HTTPS se houver um certificado SSL válido instalado no servidor da Web. Certificados inválidos incluem:

    • Certificados autoassinados.
    • Certificados assinados por uma fonte não confiável.
    • Certificados que foram revogados
    • Certificados com um assunto que não corresponde ao nome de host de destino.

Propriedades opcionais

Também é possível especificar estes campos opcionais com a solicitação watch:

  • Uma propriedade token que especifica um valor de string arbitrário para usar como um token de canal. É possível usar tokens de canal de notificação para várias finalidades. Por exemplo, você pode usar o token para verificar se cada mensagem recebida é para um canal criado pelo aplicativo, para garantir que a notificação não esteja sendo falsificada, ou para encaminhar a mensagem ao destino certo no aplicativo com base na finalidade desse canal. Comprimento máximo: 256 caracteres.

    O token é incluído no cabeçalho HTTP X-Goog-Channel-Token em todas as mensagens de notificação que o app recebe para esse canal.

    Se você usa tokens de canal de notificação, recomendamos o seguinte:

    • Use um formato de codificação extensível, como parâmetros de consulta de URL. Exemplo: forwardTo=hr&createdBy=mobile

    • Não inclua dados sensíveis, como tokens OAuth.

  • Uma string de propriedade expiration definida como um carimbo de data/hora do Unix (em milissegundos) da data e hora em que você quer que a API Directory pare de enviar mensagens para esse canal de notificação.

    Se um canal tiver um tempo de expiração, ele será incluído como o valor do cabeçalho HTTP X-Goog-Channel-Expiration (em formato legível por humanos) em todas as mensagens de notificação que o aplicativo receber para esse canal.

Para mais detalhes sobre a solicitação, consulte o método watch do recurso Users na referência da API.

Assistir resposta

Se a solicitação watch criar um canal de notificação, ela vai retornar um código de status HTTP 200 OK.

O corpo da mensagem da resposta do relógio fornece informações sobre o canal de notificação que você acabou de criar, conforme mostrado no exemplo abaixo.

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

Além das propriedades enviadas como parte da solicitação, as informações retornadas também incluem resourceId e resourceUri para identificar o recurso que está sendo monitorado neste canal de notificação.

É possível transmitir as informações retornadas para outras operações do canal de notificação, como quando você quer parar de receber notificações.

Para mais detalhes sobre a resposta, consulte o método watch do recurso Users na referência da API.

Sincronizar mensagem

Depois de criar um canal de notificação para monitorar um recurso, a API Directory envia uma mensagem sync para indicar que as notificações estão começando. O valor do cabeçalho HTTP X-Goog-Resource-State para essas mensagens é sync. Devido a problemas de tempo de rede, é possível receber a mensagem sync antes mesmo de receber a resposta do método watch.

É seguro ignorar a notificação sync, mas você também pode usá-la. Por exemplo, se você decidir que não quer manter o canal, use os valores X-Goog-Channel-ID e X-Goog-Resource-ID em uma chamada para parar de receber notificações. Também é possível usar a notificação sync para fazer alguma inicialização e se preparar para eventos futuros.

O formato das mensagens sync que a API Directory envia para seu URL de recebimento é mostrado abaixo.

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

As mensagens de sincronização sempre têm um valor de cabeçalho HTTP X-Goog-Message-Number de 1. Cada notificação subsequente para esse canal tem um número de mensagem maior que o anterior, embora os números de mensagem não sejam sequenciais.

Renovar canais de notificação

Um canal de notificação pode ter um tempo de expiração, com um valor determinado pela sua solicitação ou por qualquer limite interno da API Directory ou padrão (o valor mais restritivo é usado). O tempo de expiração do canal, se houver, é incluído como um carimbo de data/hora Unix (em milissegundos) nas informações retornadas pelo método watch. Além disso, a data e a hora de validade são incluídas (em um formato legível por humanos) em todas as mensagens de notificação que o aplicativo recebe para esse canal no cabeçalho HTTP X-Goog-Channel-Expiration.

No momento, não há uma forma automática de renovar um canal de notificação. Quando um canal estiver próximo da expiração, substitua-o por um novo chamando o método watch. Como sempre, é necessário usar um valor exclusivo para a propriedade id do novo canal. É provável que haja um período de "sobreposição" quando os dois canais de notificação do mesmo recurso estiverem ativos.

Receber notificações

Sempre que um recurso assistido muda, seu aplicativo recebe uma mensagem de notificação que descreve a mudança. A API Directory envia essas mensagens como solicitações POST HTTPS para o URL especificado como a propriedade address para este canal de notificação.

Interpretar o formato da mensagem de notificação

Todas as mensagens de notificação incluem um conjunto de cabeçalhos HTTP com prefixos X-Goog-. Alguns tipos de notificação também podem incluir um corpo de mensagem.

Cabeçalhos

As mensagens de notificação postadas pela API Directory para seu URL de recebimento incluem os seguintes cabeçalhos HTTP:

Cabeçalho Descrição
Sempre presente
X-Goog-Channel-ID UUID ou outra string exclusiva que você forneceu para identificar esse canal de notificação.
X-Goog-Message-Number Número inteiro que identifica essa mensagem para este canal de notificação. O valor é sempre 1 para mensagens sync. Os números de mensagem aumentam para cada mensagem subsequente no canal, mas não são sequenciais.
X-Goog-Resource-ID Um valor opaco que identifica o recurso monitorado. Esse ID é estável em todas as versões da API.
X-Goog-Resource-State O novo estado do recurso que acionou a notificação. Valores possíveis: sync ou um nome de evento.
X-Goog-Resource-URI Um identificador específico da versão da API para o recurso monitorado.
Às vezes presente
X-Goog-Channel-Expiration Data e hora de expiração do canal de notificação, expressas em formato legível por humanos. Só aparece se definido.
X-Goog-Channel-Token Token do canal de notificação definido pelo seu aplicativo e que pode ser usado para verificar a origem da notificação. Presente apenas se definido.

As mensagens de notificação para os usuários contêm as seguintes informações no corpo da solicitação:

Propriedade Descrição
kind Identifica isso como um recurso de usuário. Valor: a string fixa "admin#directory#user".
id Identificador exclusivo do recurso do usuário.
etag ETag da mensagem de notificação. Diferente do ETag do recurso de usuário.
primaryEmail O endereço de e-mail principal do usuário.

Exemplos

As mensagens de notificação para eventos de recursos User têm a seguinte forma geral:

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
}

Exemplo de um evento excluído pelo usuário:

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

Responder a notificações

Para indicar sucesso, você pode retornar um dos seguintes códigos de status: 200, 201, 202, 204 ou 102.

Se o serviço usar a biblioteca de cliente da API do Google e retornar 500, 502, 503 ou 504, a API Directory vai tentar novamente com espera exponencial. Todos os outros códigos de status de retorno são considerados uma falha de mensagem.

Parar notificações

A propriedade expiration controla quando as notificações são interrompidas automaticamente. Você pode parar de receber notificações de um canal específico antes que ele expire chamando o método stop no seguinte URI:

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

Esse método exige que você forneça pelo menos as propriedades id e resourceId do canal, conforme mostrado no exemplo abaixo. Se a API Directory tiver vários tipos de recursos com métodos watch, haverá apenas um método stop.

Somente usuários com a permissão correta podem interromper um canal. Especificamente:

  • Se o canal foi criado por uma conta de usuário comum, apenas o mesmo usuário do mesmo cliente (identificado pelos IDs de cliente OAuth 2.0 dos tokens de autenticação) que criou o canal pode interromper o canal.
  • Se o canal foi criado por uma conta de serviço, qualquer usuário do mesmo cliente pode interromper o canal.

O exemplo de código abaixo mostra como parar de receber notificações:

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