Configura il server per le notifiche push

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:

  1. 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.
  2. 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.
2. Sui sistemi basati su Debian installa sia Maven che il Compilatore di buffer di protocollo Google:
    $ 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
In caso contrario, puoi modificare pom.xml o il link simbolico protoc:
    $ sudo ln -s which protoc /usr/bin/protoc
5. Compila gli esempi. Verifica di poter creare il codice eseguendo 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
6. Verifica di poter eseguire il codice compilato 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" }
L'abbonato è ora attivo ed è pronto ad accettare i messaggi in arrivo messaggi.

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 }
Un messaggio è stato ricevuto ed elaborato correttamente.