Configurer le serveur pour les notifications push

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:

  1. 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.
  2. 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.
2. Sur les systèmes basés sur Debian, installez Maven et la Compilateur Google Protocol Buffers:
    $ 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
Si ce n'est pas le cas, vous pouvez modifier pom.xml ou le lien symbolique protoc:
    $ sudo ln -s which protoc /usr/bin/protoc
5. Compilez les exemples. Vérifiez que vous pouvez compiler le code en exécutant 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
6. Vérifiez que vous pouvez exécuter le code 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" }
L'abonné est maintenant en cours d'exécution et prêt à accepter les messages.

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 }
Un message a été reçu et traité correctement.