Google Play สร้างการแจ้งเตือนเพื่อตอบสนองต่อเหตุการณ์ที่เกิดขึ้น และอาจส่งผลต่อองค์กร ผู้ให้บริการโซลูชัน EMM จะรับรายการเหล่านี้ได้ การแจ้งเตือนและดำเนินการกับการแจ้งเตือน โดยส่งการแจ้งเตือนหรือกลไกอื่นๆ สำหรับ ผู้ดูแลระบบของลูกค้า เป็นต้น
คู่มือนี้จะแสดงวิธีกำหนดค่าโครงสร้างพื้นฐานของเซิร์ฟเวอร์ที่จำเป็น เพื่อรับและประมวลผลข้อความPush ของ EMM เท่านั้น การแจ้งเตือนแบบพุลไม่จำเป็นต้องตั้งค่าตามรายละเอียดในคู่มือนี้
นอกเหนือจากการตั้งค่าเซิร์ฟเวอร์ที่อธิบายไว้ในคู่มือนี้แล้ว สำหรับข้อความ Push คุณต้องให้สิทธิ์ที่เหมาะสมและกำหนดค่าอื่นๆ งานในคอนโซล Google API โปรดดู เปิดใช้ข้อความ Push ของ EMM เพื่อดูรายละเอียด
โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Cloud Pub/Sub รวมถึงตัวอย่างได้ที่ เอกสารประกอบ Cloud Pub/Sub
คุณสามารถกำหนดค่าระบบให้ส่งข้อความ Push ไปยัง อุปกรณ์ปลายทาง HTTPS ที่ระบุ หรือไปยังเซิร์ฟเวอร์ที่รอส่งการแจ้งเตือน
เกี่ยวกับการกำหนดค่าปลายทางพุช
หากต้องการกำหนดค่าปลายทางการพุช คุณต้องมีเซิร์ฟเวอร์ที่มีใบรับรอง SSL ที่ถูกต้อง ใน ในตัวอย่างนี้ คุณจะสร้างและอัปโหลดใบรับรอง SSL ไปยังผู้ออกใบรับรอง (CA) แล้วกำหนดค่าเซิร์ฟเวอร์ NGINX ขั้นตอนสุดท้าย ให้คุณคอมไพล์และเรียกใช้โค้ดทดสอบเพื่อ ยืนยันว่าการตั้งค่าของคุณถูกต้อง
ตัวอย่างนี้แสดงวิธีกำหนดค่า
เซิร์ฟเวอร์ NGINX ใน
โหมดพร็อกซีแบบย้อนกลับเพื่อเชื่อมต่อกับแอปผู้สมัครใช้บริการ (ใน PushSubscriber.java)
ทำงานในพอร์ต 8093 โดยใช้ Ubuntu 14.04 องค์กรอาจใช้
แต่การตั้งค่าตัวอย่างควรใช้งานได้ โดยไม่มีการเปลี่ยนแปลง ใน Debian ทั้งหมด
การกระจาย การกระจายอื่นๆ (เช่น การกระจายที่อิงจาก RedHat) จะคล้ายกัน
แต่ตำแหน่งของไฟล์การกำหนดค่าอาจแตกต่างกัน
ก่อนที่จะรับการแจ้งเตือน คุณต้องกำหนดค่าปลายทางที่ ตรงตามเกณฑ์ต่อไปนี้
คุณต้องเป็นเจ้าของโดเมนและยืนยันการเป็นเจ้าของใน Google API Console
คุณต้องสามารถเรียกใช้บริการบนพอร์ต 443 (SSL)
คุณต้องมีใบรับรอง SSL ที่ลงชื่อโดย CA ใบรับรองที่ลงชื่อด้วยตนเองไม่สามารถใช้ได้
เว็บเซิร์ฟเวอร์ที่คุณใช้งานอยู่ต้องรองรับ เว็บฮุค
ปลายทางของคุณไม่จำเป็นต้องเรียกใช้บน Google App Engine (แต่ก็สามารถทำได้)
สร้างและอัปโหลดใบรับรอง SSL
1. สร้างใบรับรอง Secure Sockets Layer (SSL):
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \
-newkey rsa:2048 -keyout cert.key -out cert.crt
การดำเนินการนี้จะสร้างการตอบกลับต่อไปนี้ แทนที่ค่าตัวอย่าง
(เช่น push.solarmora.com และ myusername@myhost) กับเซิร์ฟเวอร์จริงของคุณ
ชื่อ บริษัท ที่อยู่ และอื่นๆ ในโค้ดต่อไปนี้ คุณสามารถใช้
โดเมนย่อยตราบใดที่ระเบียน A ของโดเมนย่อยนี้ชี้ไปยังเซิร์ฟเวอร์ของคุณ
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. ยืนยันว่าสร้างไฟล์ใบรับรองแล้วโดยทำดังนี้
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. หากต้องการให้ใบรับรองนี้ลงนาม โปรดสร้าง คำขอลงชื่อในใบรับรอง (CSR) ที่จะอัปโหลดไปยังผู้ลงนามของคุณ ให้ทำดังนี้
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. ตรวจสอบว่าเนื้อหาของไฟล์ CSR มีลักษณะดังนี้
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. อัปโหลดส่วนของใบรับรองระหว่าง BEGIN
และ END บรรทัด (รวม) ไปยัง CA ของคุณ ขั้นตอนที่แน่นอนจะ
ขึ้นอยู่กับ CA ของคุณ แต่จะมีขั้นตอนต่อไปนี้
- อัปโหลดไฟล์ CSR ของคุณไปยังเว็บไซต์ CA หรือวางเนื้อหาของไฟล์ในเว็บไซต์ CA จากนั้น CA จะตรวจสอบและประมวลผลข้อมูลนี้
- ดาวน์โหลดใบรับรองที่ลงชื่อซึ่ง CA สร้างขึ้น
6. เอาต์พุตจาก CA ควรมีหลายไฟล์ โดยไฟล์ที่มีการรับรอง
นั้นเอง และใบรับรองของ CA ที่ยืนยันว่าตนเองมีสิทธิ์
ลงนามใบรับรอง เชื่อมโยงไฟล์ใบรับรอง *.crt ทั้งหมดในไฟล์ที่ดาวน์โหลดมา
รวมเป็นไฟล์แพ็กเกจไฟล์เดียว เช่น bundle.push.solarmora.com.crt
$ cat *.crt > bundle.push.solarmora.com.crt
กำหนดค่าพร็อกซีเซิร์ฟเวอร์
ในส่วนนี้ คุณจะกำหนดค่าเว็บเซิร์ฟเวอร์โอเพนซอร์ส NGINX และย้อนกลับ พร็อกซีเซิร์ฟเวอร์เพื่อให้บริการปลายทางและส่งต่อคำขอที่เข้ามาทั้งหมดไปยัง เซิร์ฟเวอร์สมาชิก NGINX ใช้เป็นตัวอย่าง แต่คุณสามารถใช้ พร็อกซี HTTP แทน
1. วิธีติดตั้ง NGINX ในเซิร์ฟเวอร์
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
$ nginx version: nginx/1.4.6 (Ubuntu)
2. เพื่อให้มั่นใจได้ว่าไฟล์การสร้างเซิร์ฟเวอร์ส่วนเกินที่คุณสร้างใน
NGINX ประมวลผลไดเรกทอรี sites-enabled แล้ว แก้ไข /etc/nginx/nginx.conf
และระบุข้อมูลต่อไปนี้
$ include /etc/nginx/conf.d/*.conf;
$ include /etc/nginx/sites-enabled/*;
3. คัดลอกไฟล์ใบรับรองไปยังตำแหน่งที่ปลอดภัยซึ่งสามารถอ่านได้โดย
www-data แต่คุณอาจต้องการให้มีผู้ใช้รายอื่นอ่านได้ (คุณอาจต้อง
เพื่อปรับชื่อผู้ใช้หากเว็บเซิร์ฟเวอร์ของคุณทำงานอยู่เป็น
ผู้ใช้):
$ 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. สร้างการกำหนดค่า server ใหม่ แก้ไขpush.solarmora.com
ใน /etc/nginx/sites-enabled และใช้บัญชีจริง
ชื่อโดเมนที่สมบูรณ์ในตัวเองของเซิร์ฟเวอร์เป็นชื่อไฟล์:
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. รีสตาร์ท NGINX เพื่อใช้การเปลี่ยนแปลง ดังนี้
myusername@myhost:/etc/nginx$ sudo service nginx restart
* Restarting nginx nginx
...done.
6. กำหนดค่าเซิร์ฟเวอร์ของคุณแล้ว วิธีตรวจสอบการตั้งค่า
การกำหนดค่า ให้ลองค้นหาเซิร์ฟเวอร์ของคุณโดยใช้ 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>
นี่คือการตอบสนองที่คาดหวังเนื่องจากไม่มีการกำหนดค่าเซิร์ฟเวอร์ดาวน์สตรีม
(localhost:8093 ในไฟล์การกำหนดค่า)
คอมไพล์และเรียกใช้ตัวอย่าง
หากต้องการเรียกใช้ตัวอย่างในส่วนนี้ คุณต้องมีคอนโซล Google API ที่ใช้งานอยู่ เราขอแนะนำให้คุณสร้างบัญชีเพื่อการทดสอบโดยเฉพาะ แยกโดเมนออกจากโปรเจ็กต์ที่ใช้งานจริง หลังจากสร้างโปรเจ็กต์ทดสอบแล้ว คุณต้องสร้างบัญชีบริการ จดอีเมลบัญชีบริการไว้ แล้ววางไฟล์ .p12 ที่เกี่ยวข้องไว้ที่ใดก็ได้ในเซิร์ฟเวอร์
ตั้งค่าโครงสร้างซอร์สโค้ด
1. โคลนที่เก็บ 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.
$ sudo apt-get install maven protobuf-compiler
3. ตรวจสอบว่าทั้ง Maven และคอมไพเลอร์ Protocol Buffers ของ Google ติดตั้งอย่างถูกต้อง:
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. ไฟล์การกำหนดค่า Maven pom.xml จะถือว่ามีการติดตั้งคอมไพเลอร์ Protocol Buffers ลงในไดเรกทอรี /usr/bin/protoc แล้วดังนี้
myusername@myhost:~$ which protoc
/usr/bin/protoc
pom.xml หรือลิงก์สัญลักษณ์ protoc ได้:
$ sudo ln -s which protoc /usr/bin/protoc
mvn clean compile assembly:single การดำเนินการนี้ควรสร้างไฟล์ชื่อ
emm-notifications-[version-number]-jar-with-dependencies.jar โดยที่
[version number] คือเวอร์ชันปัจจุบันของตัวอย่าง ตัวอย่างเช่น 1.0-SNAPSHOT:
myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
TestPublisher ที่คอมไพล์ได้ เป็นไปได้ที่โค้ดจะล้มเหลว:
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. คุณต้องลบล้างค่าบางค่าในไฟล์ settings.properties วิธีการคือ
สร้างสำเนาของไฟล์และแก้ไขคุณสมบัติในสำเนาดังนี้
# 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. เรียกใช้โค้ด TestPublisher อีกครั้งเพื่อให้แน่ใจว่าโค้ดจะไม่ขัดข้องอีกต่อไป (คุณอาจเห็น
ข้อผิดพลาดเดียวในเอาต์พุตบันทึก)
เรียกใช้โค้ดทดสอบของผู้เผยแพร่โฆษณา
คุณต้องเรียกใช้โค้ดตัวอย่างสำหรับการแจ้งเตือนการเผยแพร่เพื่อให้ สมาชิกมีข้อความที่จะอ่าน
ในตัวอย่างต่อไปนี้ โค้ดจะมองหา
หัวข้อที่ระบุใน my_settings.properties แต่ไม่พบหัวข้อดังกล่าว ระบบจึงสร้างหัวข้อดังกล่าว
จากนั้นจะเผยแพร่ข้อความไปยังหัวข้อดังกล่าว ตัวอย่างนี้แสดง
เครื่องมือทดสอบที่ให้คุณจำลองข้อความที่ส่งโดย 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}]}
เรียกใช้โค้ดทดสอบสมาชิก
รหัสการทดสอบสมาชิกจะยืนยันว่าคุณสามารถรับข้อความที่เผยแพร่โดย
รหัส TestPublisher
1. ตรวจสอบว่าโค้ดเป็นข้อมูลล่าสุดและคอมไพล์แล้ว จากนั้นจึงเรียกใช้ รหัสการทดสอบสมาชิก:
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"
}
2. เรียกใช้ผู้เผยแพร่โฆษณาอีกครั้ง และข้อความใหม่จะ เพิ่มในบันทึก:
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
}