Menyiapkan server untuk notifikasi push

Google Play membuat notifikasi sebagai respons terhadap peristiwa yang terjadi dan dapat memengaruhi perusahaan. Penyedia solusi EMM dapat menerima notifikasi ini dan menindaklanjutinya, misalnya dengan memberikan pemberitahuan atau mekanisme lain untuk administrator pelanggan mereka.

Panduan ini memberi tahu Anda cara mengonfigurasi infrastruktur server yang diperlukan untuk menerima dan memproses notifikasi push EMM saja. Notifikasi pull tidak memerlukan penyiapan yang dijelaskan dalam panduan ini.

Selain penyiapan server yang dijelaskan dalam panduan ini, untuk notifikasi push, Anda juga harus memberikan hak istimewa yang sesuai dan melakukan tugas konfigurasi lainnya di Konsol API Google. Lihat Mengaktifkan notifikasi push EMM untuk mengetahui detailnya.

Untuk mengetahui informasi selengkapnya tentang Google Cloud Pub/Sub, termasuk contohnya, lihat dokumentasi Cloud Pub/Sub.

Anda dapat mengonfigurasi sistem agar notifikasi push dikirim ke endpoint HTTPS yang ditetapkan, atau ke server yang menunggu notifikasi dikirim.

Tentang konfigurasi endpoint push

Untuk mengonfigurasi endpoint push, Anda memerlukan server dengan sertifikat SSL yang valid. Dalam contoh ini, Anda membuat dan mengupload sertifikat SSL ke certificate authority (CA), lalu mengonfigurasi server NGINX. Terakhir, kompilasi dan jalankan kode pengujian untuk mengonfirmasi bahwa konfigurasi Anda sudah benar.

Contoh ini menunjukkan cara mengonfigurasi server NGINX dalam mode proxy terbalik agar terhubung ke aplikasi pelanggan (dalam PushSubscriber.java) yang berjalan di port 8093, menggunakan Ubuntu 14.04. Perusahaan Anda mungkin menggunakan server lain, tetapi contoh penyiapan akan berfungsi, tanpa perubahan, pada semua distribusi berbasis Debian. Distribusi lainnya (seperti yang didasarkan pada RedHat) serupa, tetapi lokasi file konfigurasinya mungkin berbeda.

Sebelum dapat menerima notifikasi, Anda harus mengonfigurasi endpoint yang memenuhi kriteria berikut:

  • Anda harus memiliki domain dan memverifikasi kepemilikan di Konsol API Google.

  • Anda harus dapat menjalankan layanan di port 443 (SSL).

  • Anda harus memiliki sertifikat SSL yang ditandatangani CA. Sertifikat yang ditandatangani sendiri tidak berfungsi.

  • Server web yang Anda jalankan harus mendukung webhook.

Endpoint Anda tidak perlu dijalankan di Google App Engine (meskipun bisa).

Membuat dan mengupload sertifikat SSL

1. Buat sertifikat Secure Sockets Layer (SSL):

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

Tindakan ini akan menghasilkan respons berikut. Ganti nilai contoh (seperti push.solarmora.com dan myusername@myhost) dengan nama server, perusahaan, alamat Anda yang sebenarnya, dan seterusnya, pada kode berikut. Anda dapat menggunakan subdomain apa pun selama data A subdomain ini mengarah ke server Anda.

    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. Pastikan file sertifikat telah dibuat:

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

3. Agar sertifikat ini ditandatangani, buat permintaan penandatanganan sertifikat (CSR) yang akan diupload ke penanda tangan Anda:

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. Pastikan konten file CSR terlihat seperti ini:

    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. Upload bagian sertifikat Anda di antara baris BEGIN dan END (inklusif) ke CA Anda. Proses sebenarnya akan bergantung pada CA Anda, tetapi akan mencakup langkah-langkah berikut:

  1. Upload file CSR Anda ke situs CA, atau tempelkan konten file ke situs CA Anda. CA Anda kemudian memvalidasi dan memproses data ini.
  2. Download sertifikat yang ditandatangani yang dibuat oleh CA Anda.

6. Output dari CA harus berisi beberapa file: sertifikat yang ditandatangani itu sendiri dan sertifikat CA yang mengonfirmasi bahwa mereka memenuhi syarat untuk menandatangani sertifikat. Gabungkan semua file sertifikat *.crt di paket yang didownload ke dalam satu file paket, misalnya bundle.push.solarmora.com.crt:

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

Mengonfigurasi server proxy

Di bagian ini, Anda akan mengonfigurasi server web open source NGINX dan server reverse proxy untuk menyalurkan endpoint dan meneruskan semua permintaan masuk ke server pelanggan. NGINX digunakan sebagai contoh, tetapi Anda dapat menggunakan proxy HTTP lainnya.

1. Instal NGINX di server Anda:

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

2. Untuk memastikan bahwa file konfigurasi server tambahan yang Anda buat di direktori sites-enabled diproses oleh NGINX, edit /etc/nginx/nginx.conf dan sertakan hal berikut:

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

3. Salin file sertifikat Anda ke lokasi yang aman, dapat dibaca oleh pengguna www-data, tetapi sebaiknya tidak dapat dibaca oleh pengguna lain (Anda mungkin perlu menyesuaikan nama pengguna jika server web Anda berjalan sebagai pengguna lain):

    $ 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. Buat konfigurasi server baru. Edit push.solarmora.com di /etc/nginx/sites-enabled dan gunakan nama domain server aktual Anda yang sepenuhnya memenuhi syarat sebagai nama 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. Mulai ulang NGINX untuk menerapkan perubahan:

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

6. Server Anda kini telah dikonfigurasi. Untuk memverifikasi konfigurasi, coba buat kueri server Anda menggunakan 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>

Ini adalah respons yang diharapkan mengingat tidak ada server downstream yang telah dikonfigurasi (localhost:8093 dalam file konfigurasi kami).

Mengompilasi dan menjalankan contoh

Untuk menjalankan contoh di bagian ini, Anda memerlukan project Konsol API Google yang aktif. Sebaiknya buat grup iklan khusus untuk tujuan pengujian dan pisahkan dari project produksi Anda. Setelah membuat project pengujian, Anda perlu membuat akun layanan. Catat alamat email akun layanan, dan letakkan file .p12 terkait di suatu tempat di server Anda.

Menyiapkan hierarki kode sumber

1. Clone repositori 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. Pada sistem berbasis Debian, instal Maven dan compiler Google Protocol Buffers:
    $ sudo apt-get install maven protobuf-compiler

3. Pastikan compiler Maven dan Google Protocol Buffers telah diinstal dengan benar:

    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. File konfigurasi Maven pom.xml mengasumsikan bahwa compiler Buffering Protokol diinstal ke direktori /usr/bin/protoc:

    myusername@myhost:~$ which protoc
    /usr/bin/protoc
Jika tidak, Anda dapat memodifikasi pom.xml atau symlink protoc:
    $ sudo ln -s which protoc /usr/bin/protoc
5. Kompilasikan contoh. Pastikan Anda dapat membuat kode dengan menjalankan mvn clean compile assembly:single. Tindakan ini akan menghasilkan file bernama emm-notifications-[version-number]-jar-with-dependencies.jar, dengan [version number] adalah versi contoh saat ini, misalnya 1.0-SNAPSHOT:
    myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
    target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
6. Pastikan Anda dapat menjalankan kode TestPublisher yang telah dikompilasi. Kode akan gagal:

    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. Anda harus mengganti beberapa nilai di file settings.properties. Untuk melakukannya, buat salinan file dan ubah properti dalam salinan sebagai berikut:

    # 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. Jalankan kode TestPublisher lagi untuk memastikan kode tidak lagi error. (Anda mungkin melihat satu error dalam output log.)

Menjalankan kode pengujian penayang

Anda perlu menjalankan kode contoh untuk memublikasikan notifikasi sehingga pelanggan memiliki beberapa pesan untuk dibaca.

Dalam contoh berikut, kode mencari topik yang ditentukan dalam my_settings.properties, tetapi tidak menemukannya, sehingga membuat topik. Kemudian, pesan akan dipublikasikan ke topik tersebut. Contoh ini memberikan alat pengujian yang memungkinkan Anda mengemulasi pesan yang dikirim oleh Google Play EMM API.

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

Menjalankan kode pengujian pelanggan

Kode pengujian pelanggan mengonfirmasi bahwa Anda dapat menerima pesan yang dipublikasikan oleh kode TestPublisher.

1. Pastikan kode Anda sudah yang terbaru dan dikompilasi, lalu jalankan kode pengujian pelanggan:

    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" }
Pelanggan sekarang sudah berjalan dan siap menerima pesan masuk.

2. Jalankan lagi penayang, dan pesan baru akan ditambahkan ke 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 }
Pesan telah diterima dan diproses dengan benar.