Google Play genera notificaciones en respuesta a eventos que ocurren y pueden afectar a una empresa. Los proveedores de soluciones de EMM pueden recibir estos notificaciones y tomar medidas al respecto, proporcionando alertas u otros mecanismos para los administradores de clientes, por ejemplo.
En esta guía, se explica cómo configurar la infraestructura del servidor necesaria para recibir y procesar solo notificaciones push de EMM Las notificaciones de extracción no requieren la configuración que se detalla en esta guía.
Además de la configuración del servidor descrita en esta guía, para las notificaciones push también debes otorgar los privilegios adecuados y realizar otras tareas en la Consola de APIs de Google. Consulta Habilitar las notificaciones push de EMM para conocer los detalles.
Para obtener más información sobre Google Cloud Pub/Sub, incluidos ejemplos, consulta Documentación de Cloud Pub/Sub.
Puedes configurar tu sistema para que las notificaciones push se envíen a un extremo HTTPS especificado, o a un servidor que espera el envío de las notificaciones.
Acerca de la configuración de extremos de envío
Para configurar un extremo de envío, necesitas un servidor con un certificado SSL válido. En en este ejemplo, se crea y se sube un certificado SSL a una autoridad certificadora (AC) y, luego, configura el servidor de NGINX. Por último, compilas y ejecutas el código de prueba para confirma que la configuración sea correcta.
En este ejemplo, se muestra cómo configurar un
Servidor NGINX en
modo de proxy inverso para conectarse a la app del suscriptor (en PushSubscriber.java
)
que se ejecuta en el puerto 8093, con Ubuntu 14.04. Tu empresa podría usar una distinta
de muestra, pero la configuración de la muestra debería funcionar, sin cambios, en todas las
distribuciones. Otras distribuciones (como las basadas en Red Hat) son similares,
pero la ubicación de los archivos
de configuración puede ser diferente.
Antes de poder recibir notificaciones, debes configurar un extremo que cumple con los siguientes criterios:
Debe ser propietario del dominio y verificar su propiedad en la Consola de APIs de Google.
Debes poder ejecutar un servicio en el puerto 443 (SSL).
Debes tener un certificado SSL firmado por una AC. Los certificados autofirmados no funcionan.
El servidor web que ejecutas debe admitir webhooks.
No es necesario que tu extremo se ejecute en Google App Engine (aunque puede hacerlo).
Crea y sube un certificado SSL
1. Genera un certificado de capa de conexión segura (SSL):
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 -keyout cert.key -out cert.crt
Esto genera la siguiente respuesta. Reemplaza los valores de muestra
(como push.solarmora.com
y myusername@myhost
) con tu servidor real
nombre, empresa, dirección, etc., en el siguiente código. Puedes usar cualquier
subdominio, siempre y cuando el registro A
de este subdominio apunte a tu servidor.
Generating a 2048 bit RSA private key ........................................................................... .....+++ writing new private key to 'cert.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:GB State or Province Name (full name) [Some-State]:England Locality Name (eg, city) []:London Organization Name (eg, company) [Internet Widgits Pty Ltd]:Solarmora, Inc. Organizational Unit Name (eg, section) []:Creative Publications Common Name (e.g. server FQDN or YOUR name) []:push.solarmora.com Email Address []:admin@solarmora.com
2. Verifica que se haya creado un archivo de certificado:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. Para obtener la firma de este certificado, produce un solicitud de firma de certificado (CSR) que debes subir al firmante:
myusername@myhost:/tmp$ sudo openssl x509 -x509toreq -in cert.crt \ -out cert.csr -signkey cert.key Getting request Private Key Generating certificate request
myusername@myhost:/tmp$ ls cert.* cert.crt cert.csr cert.key
4. Asegúrate de que el contenido del archivo CSR se vea así:
Certificate Request: Data: Version: 0 (0x0) Subject: C=GB, ST=England, L=London, O=Solarmora, Inc., OU=Creative Publications, CN=push.solarmora.com/emailAddress=admin@solarmora.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:cc:0f:54:26:3d:d9:17:eb:8f:6c:f7:27:5e:77: 64:65:00:db:fe:2a:1f:fa:ea:de:21:7a:c5:5d:87: ... ... Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha256WithRSAEncryption 1d:ea:12:b8:c2:6a:d6:f4:6e:92:2f:b9:12:5e:e3:91:15:a0: 06:b5:81:ce:c5:cf:b7:d2:a7:dd:f2:78:ca:28:8e:21:cd:6d: ... ... -----BEGIN CERTIFICATE REQUEST----- MIIC6zCCAdMCAQAwgaUxCzAJBgNVBAYTAkdCMRAwDgYDVQQIDAdFbmdsYW5kMQ8w DQYDVQQHDAZMb25kb24xGDAWBgNVBAoMD0FDTUUgQ29ycCwgSW5jLjEYMBYGA1UE CwwPQ3JlYXRpdmUgQW52aWxzMRswGQYDVQQDDBJwdXNoLmFjbWUtY29ycC5jb20x IjAgBgkqhkiG9w0BCQEWE2FkbWluQGFjbWUtY29ycC5jb20wggEiMA0GCSqGSIb3 ... ... -----END CERTIFICATE REQUEST-----
5. Sube la parte de tu certificado entre las BEGIN
y END
líneas (incluidas) a tu AC. El proceso exacto
dependerá de tu AC, pero incluirá los siguientes pasos:
- Suba el archivo CSR en su sitio de AC o pegue el contenido del archivo en dicho sitio. Luego, tu AC valida y procesa estos datos.
- Descarga el certificado firmado que generó tu AC.
6. El resultado de la AC debe contener varios archivos:
certificado en sí y el certificado de la AC que confirme que es apto para
firmar certificados. Concatena todos los archivos de certificado *.crt
en la carpeta descargada
Conjunto en un solo archivo de paquete, por ejemplo bundle.push.solarmora.com.crt
:
$ cat *.crt > bundle.push.solarmora.com.crt
Configura tu servidor proxy
En esta sección, configurarás el servidor web de código abierto NGINX y revertirás servidor proxy para entregar el extremo y reenviar todas las solicitudes entrantes al codificador-decodificador. NGINX se usa como ejemplo, pero puedes usar cualquier otro Proxy HTTP en su lugar.
1. Instala NGINX en tu servidor:
$ sudo apt-get update $ sudo apt-get install nginx $ nginx -v $ nginx version: nginx/1.4.6 (Ubuntu)
2. Para asegurarte de que los archivos de configuración adicionales del servidor que crees en el
NGINX procesa sites-enabled
; edita /etc/nginx/nginx.conf
e incluye lo siguiente:
$ include /etc/nginx/conf.d/*.conf; $ include /etc/nginx/sites-enabled/*;
3. Copia los archivos de certificado en una ubicación segura que pueda leer la
www-data
, pero preferentemente que no sea legible para ningún otro usuario (es posible que debas
para ajustar el nombre de usuario si tu servidor web se ejecuta como un
usuario):
$ sudo mkdir -p /var/openssl/push.solarmora.com $ sudo mv /tmp/cert.key
/var/openssl/push.solarmora.com/push.solarmora.com.key $ sudo mv /tmp/bundle.push.solarmora.com.crt
/var/openssl/push.solarmora.com/bundle.push.solarmora.com.crt
4. Crea una nueva configuración de server
. Editar push.solarmora.com
en /etc/nginx/sites-enabled
y usarás tu
nombre de dominio completamente calificado del servidor como el nombre del archivo:
server {
listen 443;
server_name push.solarmora.com;
ssl on;
ssl_certificate
/var/openssl/push.solarmora.com/bundle.push.solarmora.com.crt;
ssl_certificate_key
/var/openssl/push.solarmora.com/push.solarmora.com.key;
# it is usually very convenient to have separate files for your
# access and error log to analyze for possible problems
access_log /var/log/nginx/nginx.push.solarmora.com.log;
error_log /var/log/nginx/nginx.push.solarmora.com.log;
location / {
# assuming the subscriber will run on the same machine
# on port 8093
proxy_pass http://localhost:8093;
}
}
5. Reinicia NGINX para implementar los cambios:
myusername@myhost:/etc/nginx$ sudo service nginx restart * Restarting nginx nginx ...done.
6. Tu servidor ya está configurado. Para verificar el
intenta consultar tu servidor con curl
:
[myusername@myhost:~]$ curl push.solarmora.com <html> <head><title>502 Bad Gateway</title></head> <body bgcolor="white"> <center><h1>502 Bad Gateway</h1></center> <hr><center>nginx/1.4.6 (Ubuntu)</center> </body> </html>
Esta es la respuesta esperada dado que no se configuró ningún servidor downstream
(localhost:8093
en nuestro archivo de configuración).
Compila y ejecuta ejemplos
Para ejecutar los ejemplos de esta sección, necesitarás una Consola de APIs de Google activa en un proyecto final. Te recomendamos que crees uno específicamente para realizar pruebas y mantenerlo separado del proyecto de producción. Después de crear un proyecto de prueba, Debes crear una cuenta de servicio. Toma nota de la dirección de correo electrónico de la cuenta de servicio y coloca el archivo .p12 asociado en algún lugar de tu servidor.
Configura el árbol del código fuente
1. Clona el repositorio play-work.git
:
myusername@myhost:~/code$ git clone https://github.com/google/play-work.git Cloning into 'play-work'... Username for 'https://github.com': username Password for 'https://username@github.com': remote: Counting objects: 110, done. remote: Compressing objects: 100% (60/60), done. remote: Total 110 (delta 24), reused 95 (delta 9), pack-reused 0 Receiving objects: 100% (110/110), 23.88 KiB | 0 bytes/s, done. Resolving deltas: 100% (24/24), done. Checking connectivity... done.
$ sudo apt-get install maven protobuf-compiler
3. Verifica que Maven y el compilador de búferes de protocolo de Google estén correctamente instalado:
myusername@myhost:~$ mvn -v Apache Maven 3.0.5 Maven home: /usr/share/maven Java version: 1.7.0_75, vendor: Oracle Corporation Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.16.0-30-generic", arch: "amd64", family: "unix"
myusername@myhost:~$ protoc --version libprotoc 2.5.0
4. El archivo de configuración de Maven pom.xml
supone que el compilador de búferes de protocolo está instalado en el directorio /usr/bin/protoc
:
myusername@myhost:~$ which protoc /usr/bin/protoc
pom.xml
o symlink protoc
:
$ sudo ln -s which protoc
/usr/bin/protoc
mvn clean compile assembly:single
. Esto debería producir un archivo llamado
emm-notifications-[version-number]-jar-with-dependencies.jar
, donde
[version number]
es la versión actual del ejemplo, por ejemplo 1.0-SNAPSHOT
:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/* target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher
compilado. Se espera que el código falle:
myusername@myhost:~/code/play-work/examples/emm-notifications$ java -cp \ target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar \ com.google.android.work.emmnotifications.TestPublisher Exception in thread "main" java.lang.IllegalArgumentException: You must specify non-default ServiceAccountEmail in settings.properties at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:119) at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:69) at com.google.android.work.emmnotifications.Settings.verifyVariable(Settings.java:129) at com.google.android.work.emmnotifications.Settings.getSettings(Settings.java:103) at com.google.android.work.emmnotifications.TestPublisher.main(TestPublisher.java:39)
7. Debes anular algunos valores en el archivo settings.properties
. Para ello,
crea una copia del archivo y modifica las propiedades de la copia de la siguiente manera:
# This should be your own service account's email address ServiceAccountEmail=368628613713-t4hfexampledn5lhpdcu1qqfgio01626@developer.gserviceaccount.com ServiceAccountP12KeyFile=/opt/secret/secret.p12
# This will be the name of the service account ProjectName=enterprise-cloud-pub-sub SubscriptionName=projects/enterprise-cloud-pub-sub/subscriptions/default TopicName=projects/enterprise-cloud-pub-sub/topics/default
# The push endpoint in your API Console project PushEndpoint=https://push.solarmora.com
8. Vuelve a ejecutar el código TestPublisher
para asegurarte de que ya no falle. (Es posible que veas un
único error en los resultados del registro).
Ejecuta el código de prueba del publicador
Debes ejecutar el código de muestra para publicar notificaciones de modo que tu el suscriptor tiene algunos mensajes para leer.
En el siguiente ejemplo, el código busca
tema especificado en my_settings.properties
, pero no lo encuentra, por lo que crea el tema.
Luego, publica un mensaje en el tema. En este ejemplo, se proporciona un valor
de prueba que te permite emular mensajes enviados por la API de EMM de Google Play.
myusername@myhost:~/code/play-work/examples/emm-notifications$ DEVELOPER_CONSOLE_SETTINGS=./my_settings.properties java -cp \ target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar com.google.android.work.emmnotifications.TestPublisher Feb 27, 2015 1:39:59 PM com.google.android.work.emmnotifications.RetryHttpInitializerWrapper$1 handleResponse INFO: RetryHandler: { "error": { "code": 404, "message": "Resource not found (resource=default).", "errors": [ { "message": "Resource not found (resource=default).", "domain": "global", "reason": "notFound" } ], "status": "NOT_FOUND" } } Feb 27, 2015 1:39:59 PM com.google.android.work.emmnotifications.TestPublisher main INFO: Topic projects/enterprise-cloud-pub-sub/topics/default doesn't exists, creating it Feb 27, 2015 1:40:02 PM com.google.android.work.emmnotifications.TestPublisher main INFO: Topic projects/enterprise-cloud-pub-sub/topics/default created Feb 27, 2015 1:40:02 PM com.google.android.work.emmnotifications.TestPublisher main INFO: Publishing a request: {messages=[{data=CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA}]}
Ejecuta el código de prueba del suscriptor
El código de prueba de suscriptor confirma que puedes recibir los mensajes publicados por
el código TestPublisher
1. Asegúrate de que tu código esté actualizado y compilado y, luego, ejecuta el Código de prueba de suscriptor:
myusername@myhost:~/code/play-work/examples/emm-notifications$ DEVELOPER_CONSOLE_SETTINGS=./my_settings.properties
java -cp target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
com.google.android.work.emmnotifications.PushSubscriber Feb 27, 2015 1:46:37 PM com.google.android.work.emmnotifications.PushSubscriber main INFO: Will be using topic name: projects/enterprise-cloud-pub-sub/topics/default, subscription name:
projects/enterprise-cloud-pub-sub/subscriptions/default Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.PushSubscriber main INFO: Trying to get subscription named projects/enterprise-cloud-pub-sub/subscriptions/default Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.RetryHttpInitializerWrapper$1 handleResponse INFO: RetryHandler: { "error": { "code": 404, "message": "Resource not found (resource=default).", "errors": [ { "message": "Resource not found (resource=default).", "domain": "global", "reason": "notFound" } ], "status": "NOT_FOUND" } } Feb 27, 2015 1:46:38 PM com.google.android.work.emmnotifications.PushSubscriber main INFO: Subscription doesn't exist, will try to create projects/enterprise-cloud-pub-sub/subscriptions/default Feb 27, 2015 1:46:43 PM com.google.android.work.emmnotifications.PushSubscriber main INFO: Created: { "ackDeadlineSeconds" : 600, "name" : "projects/enterprise-cloud-pub-sub/subscriptions/default", "pushConfig" : { "pushEndpoint" : "https://push.solarmora.com" }, "topic" : "projects/enterprise-cloud-pub-sub/topics/default" }
2. Ejecuta el publicador nuevamente y los mensajes nuevos agregado al registro:
Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle INFO: Raw request: {"message":{"data":"CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA",
"attributes":{},"message_id":"71571141246"},"subscription":"/subscriptions/enterprise-cloud-pub-sub/default"} Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle INFO: Pubsub message received: { "attributes" : { }, "data" : "CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA", "message_id" : "71571141246" } Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle INFO: Message received: product_approval_event { common_event_information { enterprise_id: "12321321" event_notification_sent_timestamp: "right now" } product_id: "com.google.android.gms" approved: false }