Server für Push-Benachrichtigungen einrichten

Google Play generiert Benachrichtigungen als Reaktion auf Ereignisse, die auftreten und sich auf ein Unternehmen auswirken können. Anbieter von EMM-Lösungen erhalten diese und auf sie reagieren, indem sie Warnungen oder andere Mechanismen Kundenadministratoren.

In diesem Leitfaden erfahren Sie, wie Sie die erforderliche Serverinfrastruktur , um nur Push-Benachrichtigungen von EMM-Anbietern zu empfangen und zu verarbeiten. Für Pull-Benachrichtigungen ist die in diesem Leitfaden beschriebene Einrichtung nicht erforderlich.

Zusätzlich zur in diesem Leitfaden beschriebenen Servereinrichtung können Sie für Push-Benachrichtigungen müssen Sie auch die entsprechenden Berechtigungen erteilen und andere in der Google API Console ausführen. Weitere Informationen finden Sie unter EMM-Push-Benachrichtigungen aktivieren .

Weitere Informationen und Beispiele zu Google Cloud Pub/Sub finden Sie unter Cloud Pub/Sub-Dokumentation

Sie können Ihr System so konfigurieren, dass Push-Benachrichtigungen an einen An einen angegebenen HTTPS-Endpunkt oder an einen Server, der auf das Senden von Benachrichtigungen wartet.

Konfiguration des Push-Endpunkts

Zum Konfigurieren eines Push-Endpunkts benötigen Sie einen Server mit einem gültigen SSL-Zertifikat. In In diesem Beispiel erstellen Sie ein SSL-Zertifikat und laden es in eine Zertifizierungsstelle hoch. (CA) und konfigurieren Sie dann den NGINX-Server. Schließlich kompilieren und führen Sie Testcode aus, überprüfen, ob die Einrichtung korrekt ist.

In diesem Beispiel wird gezeigt, wie ein NGINX-Server in Reverse-Proxy-Modus zum Herstellen einer Verbindung mit der Abonnenten-App (in PushSubscriber.java) auf Port 8093 unter Verwendung von Ubuntu 14.04 läuft. Ihr Unternehmen verwendet möglicherweise eine andere Server. Das Beispiel-Setup sollte jedoch ohne Änderungen auf allen Debian-basierten Verteilungen. Andere Distributionen (wie diejenigen, die auf RedHat basieren) sind ähnlich, aber der Speicherort der Konfigurationsdateien kann abweichen.

Bevor Sie Benachrichtigungen erhalten können, müssen Sie einen Endpunkt konfigurieren, der erfüllt folgende Kriterien:

  • Sie müssen Inhaber der Domain sein und Ihre Inhaberschaft in der Google API Console:

  • Sie müssen einen Dienst über Port 443 (SSL) ausführen können.

  • Sie benötigen ein von einer Zertifizierungsstelle signiertes SSL-Zertifikat. Selbst signierte Zertifikate funktionieren nicht.

  • Der von Ihnen ausgeführte Webserver muss Webhooks.

Der Endpunkt muss nicht in Google App Engine ausgeführt werden, obwohl dies möglich ist.

SSL-Zertifikat erstellen und hochladen

1. Erstellen Sie ein SSL-Zertifikat (Secure Sockets Layer):

    myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \
      -newkey rsa:2048 -keyout cert.key -out cert.crt

Dadurch wird die folgende Antwort generiert. Beispielwerte ersetzen (z. B. push.solarmora.com und myusername@myhost) durch Ihren tatsächlichen Server. Name, Firma, Adresse usw. im folgenden Code eingeben. Sie können beliebige Subdomain verwenden, solange der A-Eintrag dieser Subdomain auf Ihren Server verweist.

    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. Prüfen Sie, ob eine Zertifikatsdatei erstellt wurde:

$ myusername@myhost:/tmp$ ls cert*
cert.crt  cert.key

3. Um dieses Zertifikat zu signieren, müssen Sie ein Zertifikatsignierungsanfrage, die Sie für den Unterzeichner hochladen möchten:

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. Stellen Sie sicher, dass der Inhalt der CSR-Datei wie folgt aussieht:

    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. Laden Sie den Teil Ihres Zertifikats zwischen den BEGIN hoch und END Zeilen (einschließlich) zu Ihrer Zertifizierungsstelle hinzu. Der genaue Vorgang ist von Ihrer Zertifizierungsstelle abhängig, umfasst jedoch die folgenden Schritte:

  1. Laden Sie die CSR-Datei auf Ihre CA-Website hoch oder fügen Sie den Inhalt der Datei auf Ihrer CA-Website ein. Ihre Zertifizierungsstelle validiert und verarbeitet diese Daten dann.
  2. Laden Sie das von Ihrer Zertifizierungsstelle generierte signierte Zertifikat herunter.

6. Die Ausgabe der Zertifizierungsstelle sollte mehrere Dateien enthalten: die signierte Zertifikat selbst und das Zertifikat der Zertifizierungsstelle, die bestätigt, Zertifikate signieren. Verketten Sie alle *.crt-Zertifikatsdateien im heruntergeladenen in einer einzigen Bundle-Datei zusammenfassen, z. B. bundle.push.solarmora.com.crt:

$ cat *.crt > bundle.push.solarmora.com.crt

Proxyserver konfigurieren

In diesem Abschnitt konfigurieren Sie den Open Source-Webserver NGINX und kehren um den Endpunkt zu bedienen und alle eingehenden Anfragen an den Abonnentenserver. Als Beispiel dient NGINX. Sie können aber auch jede andere HTTP-Proxy.

1. Installieren Sie NGINX auf Ihrem Server:

    $ sudo apt-get update
    $ sudo apt-get install nginx
    $ nginx -v
    $ nginx version: nginx/1.4.6 (Ubuntu)

2. Um sicherzustellen, dass die zusätzlichen Serverkonfigurationsdateien, die Sie im Das Verzeichnis „sites-enabled“ wird von NGINX verarbeitet, bearbeiten Sie /etc/nginx/nginx.conf und Folgendes enthalten:

    $ include /etc/nginx/conf.d/*.conf;
    $ include /etc/nginx/sites-enabled/*;

3. Kopieren Sie Ihre Zertifikatsdateien an einen sicheren Ort, der vom www-data-Nutzer, aber nach Möglichkeit für andere Nutzer nicht lesbar. um den Nutzernamen anzupassen, wenn Ihr Webserver als ein anderer Nutzer):

    $ 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. Erstellen Sie eine neue server-Konfiguration. push.solarmora.com bearbeiten in /etc/nginx/sites-enabled und verwenden Sie Ihren tatsächlichen vollqualifizierten Domainnamen des Servers als Dateiname verwenden:

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. Starten Sie NGINX neu, um die Änderungen zu implementieren:

    myusername@myhost:/etc/nginx$ sudo service nginx restart
    * Restarting nginx nginx
    ...done.

6. Ihr Server ist nun konfiguriert. Um die versuchen Sie, Ihren Server mit curl abzufragen:

    [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>

Dies ist die erwartete Antwort, da kein Downstream-Server konfiguriert wurde (localhost:8093 in unserer Konfigurationsdatei).

Beispiele kompilieren und ausführen

Zum Ausführen der Beispiele in diesem Abschnitt benötigen Sie eine aktive Google API Console. Projekt arbeiten. Wir empfehlen Ihnen, eine speziell zu Testzwecken und um sie von Ihrem Produktionsprojekt zu trennen. Nachdem Sie ein Testprojekt erstellt haben, müssen Sie ein Dienstkonto erstellen. Notieren Sie sich die E-Mail-Adresse des Dienstkontos und legen Sie die zugehörige P12-Datei auf Ihrem Server ab.

Quellcodestruktur einrichten

1. Klonen Sie das 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. Installieren Sie auf Debian-basierten Systemen sowohl Maven als auch die Google Protocol Buffers-Compiler:
    $ sudo apt-get install maven protobuf-compiler

3. Prüfen, ob sowohl Maven als auch der Google Protocol Buffers-Compiler korrekt installiert ist:

    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. Die Maven-Konfigurationsdatei pom.xml geht davon aus, dass der Protocol Buffers-Compiler im Verzeichnis /usr/bin/protoc installiert ist:

    myusername@myhost:~$ which protoc
    /usr/bin/protoc
Ist dies nicht der Fall, können Sie entweder pom.xml oder symlink protoc ändern:
    $ sudo ln -s which protoc /usr/bin/protoc
5. Kompilieren Sie die Beispiele. Prüfen Sie, ob Sie den Code erstellen können, indem Sie mvn clean compile assembly:single ausführen. Dadurch sollte eine Datei mit dem Namen emm-notifications-[version-number]-jar-with-dependencies.jar, wobei [version number] ist die aktuelle Version des Beispiels, z. B. 1.0-SNAPSHOT:
    myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
    target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
6. Prüfe, ob du den kompilierten TestPublisher-Code ausführen kannst. Es ist davon auszugehen, dass der Code fehlschlägt:

    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. Einige Werte in der Datei settings.properties müssen überschrieben werden. Gehen Sie dazu wie folgt vor: Erstellen Sie eine Kopie der Datei und ändern Sie die Eigenschaften in der Kopie wie folgt:

    # 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. Führen Sie den TestPublisher-Code noch einmal aus, damit er nicht mehr abstürzt. (Möglicherweise wird ein einzelner Fehler in der Logausgabe.)

Publisher-Testcode ausführen

Sie müssen den Beispielcode für Veröffentlichungsbenachrichtigungen ausführen, damit Ihr hat Abonnent einige Nachrichten zu lesen.

Im folgenden Beispiel sucht der Code nach dem Thema, das in my_settings.properties angegeben wurde, es aber nicht findet. Daher wird das Thema erstellt. Anschließend wird eine Nachricht im Thema veröffentlicht. Dieses Beispiel bietet eine wertvolle Testtool, mit dem Sie Nachrichten emulieren können, die von der Google Play EMM API gesendet werden.

    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}]}

Testcode für Abonnenten ausführen

Der Testcode für Abonnenten bestätigt, dass Sie die Nachrichten empfangen können, die von den TestPublisher-Code.

1. Stellen Sie sicher, dass Ihr Code aktuell und kompiliert ist, und führen Sie dann den Testcode für Abonnenten:

    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" }
Der Abonnent wird jetzt ausgeführt und ist bereit, eingehende Anrufe anzunehmen. Nachrichten.

2. Führen Sie den Publisher noch einmal aus. Neue Nachrichten werden wurde dem Protokoll hinzugefügt:

    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 }
Eine Nachricht wurde ordnungsgemäß empfangen und verarbeitet.