Google Play genera notifiche in risposta a eventi che si verificano. e possono influire sull'azienda. I provider di soluzioni EMM possono ricevere questi notifiche e agire su di esse, fornendo avvisi o altri meccanismi per per gli amministratori dei propri clienti.
Questa guida spiega come configurare l'infrastruttura server necessaria per ricevere ed elaborare soltanto notifiche push EMM. Le notifiche pull non richiedono la configurazione descritta in questa guida.
Oltre alla configurazione del server descritta in questa guida, per le notifiche push devi inoltre concedere i privilegi appropriati ed eseguire altre le attività nella console API di Google. Consulta Attiva le notifiche push EMM per maggiori dettagli.
Per ulteriori informazioni su Google Cloud Pub/Sub, inclusi esempi, consulta documentazione di Cloud Pub/Sub.
È possibile configurare il sistema in modo che le notifiche push vengano inviate a un o a un server in attesa dell'invio delle notifiche.
Informazioni sulla configurazione degli endpoint di push
Per configurare un endpoint push, è necessario un server con un certificato SSL valido. Nella in questo esempio, crei e carichi un certificato SSL in un'autorità di certificazione (CA), quindi configura il server NGINX. Infine, compili ed esegui il codice di test conferma che la configurazione è corretta.
Questo esempio mostra come configurare
Server NGINX in
modalità proxy inversa per connettersi all'app dell'abbonato (in PushSubscriber.java
)
sulla porta 8093, con Ubuntu 14.04. La tua azienda potrebbe utilizzare un'interfaccia
ma la configurazione di esempio dovrebbe funzionare, senza modifiche, su tutti i server
distribuibili. Altre distribuzioni (come quelle basate su RedHat) sono simili,
ma la posizione dei file di configurazione potrebbe essere diversa.
Prima di poter ricevere le notifiche, devi configurare un endpoint che soddisfa i seguenti criteri:
Devi essere il proprietario del dominio e verificarne la proprietà nel Console API di Google.
Devi poter eseguire un servizio sulla porta 443 (SSL).
Devi disporre di un certificato SSL firmato da un'autorità di certificazione. I certificati autofirmati non funzionano.
Il server web in esecuzione deve supportare webhook.
Non è necessario che il tuo endpoint sia eseguito su Google App Engine (anche se può farlo).
Crea e carica un certificato SSL
1. Crea un certificato SSL (Secure Sockets Layer):
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 -keyout cert.key -out cert.crt
Questo genera la seguente risposta. Sostituisci i valori di esempio
(ad esempio push.solarmora.com
e myusername@myhost
) con il server effettivo
nome, azienda, indirizzo e così via nel seguente codice. Puoi utilizzare qualsiasi
purché il record A
di questo sottodominio rimandi al tuo server.
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 che sia stato creato un file di certificato:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. Per ottenere la firma di questo certificato, produci un richiesta di firma del certificato (CSR) da caricare per il firmatario:
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. Assicurati che il contenuto del file CSR abbia il seguente aspetto:
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. Carica la parte del certificato tra BEGIN
e END
(incluse) per arrivare alla CA. La procedura esatta
dipende dalla CA, ma includerà i seguenti passaggi:
- Carica il file CSR nel sito della CA o incolla il contenuto del file nel sito dell'autorità di certificazione. La CA convalida quindi ed elabora questi dati.
- Scarica il certificato firmato generato dalla tua CA.
6. L'output dell'autorità di certificazione dovrebbe contenere più file: il file
e il certificato dell'autorità di certificazione che conferma l'idoneità a
di firma dei certificati. Concatena tutti i *.crt
file di certificato nella cartella scaricata
Raggruppa in un unico file di bundle, ad esempio bundle.push.solarmora.com.crt
:
$ cat *.crt > bundle.push.solarmora.com.crt
Configura il server proxy
In questa sezione configurerai il server web open source NGINX e invertirai server proxy per gestire l'endpoint e inoltrare tutte le richieste in entrata del sottoscrittore. Come esempio viene utilizzato NGINX, ma puoi utilizzare qualsiasi altro proxy HTTP.
1. Installa NGINX sul tuo server:
$ sudo apt-get update $ sudo apt-get install nginx $ nginx -v $ nginx version: nginx/1.4.6 (Ubuntu)
2. Per assicurarti che i file di conifgurazione del server aggiuntivi creati nella
Le directory sites-enabled
vengono elaborate da NGINX, modifica /etc/nginx/nginx.conf
e includere quanto segue:
$ include /etc/nginx/conf.d/*.conf; $ include /etc/nginx/sites-enabled/*;
3. Copia i file dei certificati in un luogo sicuro, leggibile dal
www-data
utente, ma preferibilmente non leggibile da parte di altri utenti (potresti aver bisogno
per modificare il nome utente se il server web funziona con un server web
utente):
$ 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 nuova configurazione di server
. Modifica push.solarmora.com
in /etc/nginx/sites-enabled
e utilizza le entrate
nome di dominio completo del server come nome file:
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. Riavvia NGINX per implementare le modifiche:
myusername@myhost:/etc/nginx$ sudo service nginx restart * Restarting nginx nginx ...done.
6. Il server è ora configurato. Per verificare il
prova a eseguire una query sul tuo server utilizzando 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>
Questa è la risposta prevista dato che non è stato configurato alcun server downstream
(localhost:8093
nel nostro file di configurazione).
Compila ed esegui esempi
Per eseguire gli esempi in questa sezione, devi avere una console API di Google attiva. progetto. Ti consigliamo di crearne uno specifico per scopi di test e e mantenerlo separato dal progetto di produzione. Dopo aver creato un progetto di test, devi creare un account di servizio. Prendi nota dell'indirizzo email dell'account di servizio e inserisci il file .p12 associato da qualche parte sul tuo server.
Configurare la struttura del codice sorgente
1. Clona il repository 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 che sia Maven sia il compilatore di Google Protocol Buffers siano installato correttamente:
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. Il file di configurazione Maven pom.xml
presuppone che il compilatore Protocol Buffers sia installato nella directory /usr/bin/protoc
:
myusername@myhost:~$ which protoc /usr/bin/protoc
pom.xml
o il link simbolico protoc
:
$ sudo ln -s which protoc
/usr/bin/protoc
mvn clean compile assembly:single
. Dovrebbe essere visualizzato un file denominato
emm-notifications-[version-number]-jar-with-dependencies.jar
, dove
[version number]
è la versione corrente dell'esempio, ad esempio 1.0-SNAPSHOT
:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/* target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher
. È normale che il codice abbia esito negativo:
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. Devi sostituire alcuni valori nel file settings.properties
. Per farlo,
crea una copia del file e modifica le proprietà nella copia come segue:
# 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. Esegui di nuovo il codice TestPublisher
per assicurarti che non si arresti più in modo anomalo. (Potresti notare
un singolo errore nell'output di log.)
Eseguire il codice di test del publisher
Devi eseguire il codice campione per pubblicare le notifiche, in modo che il sottoscrittore ha alcuni messaggi da leggere.
Nell'esempio seguente, il codice cerca la macro
all'argomento specificato in my_settings.properties
ma non lo trova, pertanto viene creato l'argomento.
Quindi pubblica un messaggio nell'argomento. Questo esempio fornisce una preziosa
strumento di test che ti consente di emulare i messaggi inviati dall'API EMM di 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}]}
Esegui il codice di test dell'abbonato
Il codice di test del sottoscrittore conferma che puoi ricevere i messaggi pubblicati da
il codice TestPublisher
.
1. Assicurati che il codice sia aggiornato e compilato, quindi esegui codice di test del sottoscrittore:
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. Esegui di nuovo il publisher e i nuovi messaggi verranno aggiunti al log:
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 }