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:
- Upload file CSR Anda ke situs CA, atau tempelkan konten file ke situs CA Anda. CA Anda kemudian memvalidasi dan memproses data ini.
- 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/protocJika 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.jar6. 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.propertiesPelanggan sekarang sudah berjalan dan siap menerima pesan masuk.
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. 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",Pesan telah diterima dan diproses dengan benar.
"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 }