Google Play génère des notifications en réponse à des événements qui se produisent. et peut affecter une entreprise. Les fournisseurs de solutions EMM peuvent recevoir des notifications et de prendre des mesures en conséquence, en créant des alertes ou d'autres mécanismes les administrateurs de leurs clients, par exemple.
Ce guide vous explique comment configurer l'infrastructure de serveurs nécessaire pour recevoir et traiter uniquement les notifications push EMM. Les notifications pull ne nécessitent pas la configuration détaillée dans ce guide.
En plus de la configuration du serveur décrite dans ce guide, les notifications push vous devez aussi accorder les privilèges appropriés et effectuer d'autres configurations dans la console Google APIs. Voir Activer les notifications push EMM pour en savoir plus.
Pour en savoir plus sur Google Cloud Pub/Sub et obtenir des exemples, consultez la page Documentation Cloud Pub/Sub
Vous pouvez configurer votre système de sorte que les notifications push soient envoyées point de terminaison HTTPS spécifié, ou vers un serveur qui attend l'envoi des notifications.
À propos de la configuration d'un point de terminaison push
Pour configurer un point de terminaison push, vous avez besoin d'un serveur avec un certificat SSL valide. Dans Dans cet exemple, vous créez un certificat SSL et l'importez auprès d'une autorité de certification (CA), puis configurez le serveur NGINX. Enfin, compilez et exécutez du code de test pour et vérifiez que votre configuration est correcte.
Cet exemple montre comment configurer un
Serveur NGINX dans
mode proxy inverse pour se connecter à l'application de l'abonné (dans PushSubscriber.java
)
exécuté sur le port 8093, avec Ubuntu 14.04. Votre entreprise peut utiliser une autre
mais l'exemple de configuration devrait fonctionner, sans modification, sur tous les
distributions. D'autres distributions (telles que celles basées sur RedHat) sont similaires,
mais l'emplacement des fichiers
de configuration peut être différent.
Avant de pouvoir recevoir des notifications, vous devez configurer un point de terminaison qui répond aux critères suivants:
Vous devez être propriétaire du domaine et confirmer que vous en êtes le propriétaire dans le Console Google APIs
Vous devez pouvoir exécuter un service sur le port 443 (SSL).
Vous devez disposer d'un certificat SSL signé par une autorité de certification. Les certificats autosignés ne fonctionnent pas.
Le serveur Web que vous exécutez doit prendre en charge webhooks.
Votre point de terminaison n'a pas besoin de s'exécuter sur Google App Engine (bien que cela puisse être possible).
Créer et importer un certificat SSL
1. Créez un certificat SSL (Secure Sockets Layer) :
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 -keyout cert.key -out cert.crt
Cela génère la réponse suivante. Remplacer les exemples de valeurs
(push.solarmora.com
et myusername@myhost
, par exemple) par votre serveur réel
nom, entreprise, adresse, etc., dans le code suivant. Vous pouvez utiliser
sous-domaine tant que l'enregistrement A
de ce sous-domaine pointe vers votre serveur.
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. Vérifiez qu'un fichier de certificat a été créé:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. Pour obtenir la signature de ce certificat, produisez un demande de signature de certificat (CSR) à importer pour votre signataire:
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. Assurez-vous que le contenu du fichier CSR se présente comme suit:
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. Importez la partie de votre certificat entre BEGIN
et END
lignes (incluses) vers votre autorité de certification. Le processus exact
dépend de votre autorité de certification, mais comprend les étapes suivantes:
- Importez votre fichier CSR sur le site de votre autorité de certification ou collez son contenu sur le site de votre autorité de certification. Votre autorité de certification valide et traite ensuite ces données.
- Téléchargez le certificat signé généré par votre autorité de certification.
6. Le résultat de l'autorité de certification doit contenir plusieurs fichiers: les fichiers signés
le certificat lui-même et le certificat de l'autorité de certification confirmant qu'ils sont admissibles
signer des certificats. Concaténer tous les fichiers de certificat *.crt
dans le fichier téléchargé
dans un seul fichier de bundle, par exemple bundle.push.solarmora.com.crt
:
$ cat *.crt > bundle.push.solarmora.com.crt
Configurer votre serveur proxy
Dans cette section, vous allez configurer le serveur Web Open Source NGINX et inverser serveur proxy pour desservir le point de terminaison et transférer toutes les requêtes entrantes au pour le serveur d'abonnés. NGINX est fourni à titre d'exemple, mais vous pouvez via un proxy HTTP.
1. Installez NGINX sur votre serveur:
$ sudo apt-get update $ sudo apt-get install nginx $ nginx -v $ nginx version: nginx/1.4.6 (Ubuntu)
2. Pour vous assurer que les fichiers de conifguration de serveur supplémentaires que vous créez dans le
Les répertoires sites-enabled
sont traités par NGINX, modifiez /etc/nginx/nginx.conf
et inclure les éléments suivants:
$ include /etc/nginx/conf.d/*.conf; $ include /etc/nginx/sites-enabled/*;
3. Copiez vos fichiers de certificat dans un emplacement sécurisé, lisible par le
www-data
, mais de préférence non lisible par un autre utilisateur (vous devrez peut-être
pour modifier le nom d'utilisateur si votre serveur Web fonctionne
utilisateur):
$ 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. Créez une configuration server
. Modifier push.solarmora.com
en /etc/nginx/sites-enabled
et utilisez votre
le nom de domaine complet du serveur en tant que nom de fichier:
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. Redémarrez NGINX pour appliquer les modifications:
myusername@myhost:/etc/nginx$ sudo service nginx restart * Restarting nginx nginx ...done.
6. Votre serveur est maintenant configuré. Pour vérifier
, essayez d'interroger votre serveur à l'aide de 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>
Cette réponse est attendue, car aucun serveur en aval n'a été configuré.
(localhost:8093
dans notre fichier de configuration).
Compiler et exécuter des exemples
Pour exécuter les exemples de cette section, vous avez besoin d'une console Google APIs active. projet. Nous vous recommandons d'en créer une spécifiquement à des fins de test et séparez-la de votre projet de production. Après avoir créé un projet de test, vous devez créer un compte de service. Notez l'adresse e-mail du compte de service et placez le fichier .p12 associé quelque part sur votre serveur.
Configurer l'arborescence du code source
1. Clonez le dépôt 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. Vérifiez que Maven et le compilateur Google Protocol Buffers sont correctement installé:
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. Le fichier de configuration Maven pom.xml
suppose que le compilateur Protocol Buffers est installé dans le répertoire /usr/bin/protoc
:
myusername@myhost:~$ which protoc /usr/bin/protoc
pom.xml
ou le lien symbolique protoc
:
$ sudo ln -s which protoc
/usr/bin/protoc
mvn clean compile assembly:single
. Cela devrait générer un fichier nommé
emm-notifications-[version-number]-jar-with-dependencies.jar
, où
[version number]
est la version actuelle de l'exemple, par exemple 1.0-SNAPSHOT
:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/* target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher
compilé. Il est normal que le code échoue:
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. Vous devez remplacer certaines valeurs dans le fichier settings.properties
. Pour ce faire,
créez une copie du fichier et modifiez ses propriétés comme suit:
# 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. Exécutez à nouveau le code TestPublisher
pour vous assurer qu'il ne plante plus. Il est possible que
une seule erreur dans la sortie du journal.)
Exécuter le code de test de l'éditeur
Vous devez exécuter l'exemple de code pour publier des notifications afin que votre l'abonné a des messages à lire.
Dans l'exemple suivant, le code recherche
sujet spécifié dans my_settings.properties
, mais ne le trouve pas et crée donc le sujet.
Il publie ensuite un message dans le sujet. Cet exemple fournit
qui vous permet d'émuler les messages envoyés par l'API EMM 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}]}
Exécuter le code de test de l'abonné
Le code de test d'abonné confirme que vous pouvez recevoir les messages publiés par
le code TestPublisher
.
1. Assurez-vous que votre code est à jour et compilé, puis exécutez la code de test pour les abonnés:
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. Exécutez à nouveau le diffuseur. Les nouveaux messages sont alors ajouté au journal:
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 }