מערכת Google Play יוצרת התראות בתגובה לאירועים שמתרחשים וזה יכול להשפיע על ארגונים. ספקי פתרונות EMM יכולים לקבל את הפרטים האלה הודעות ולפעול לפיהן, על ידי הצגת התראות או מנגנונים אחרים את מנהלי הלקוחות שלהם, למשל.
המדריך הזה מסביר איך להגדיר את תשתית השרת הדרושה כדי לקבל ולעבד התראות push של EMM בלבד. אין צורך לבצע את ההגדרה שמפורטת במדריך הזה כדי לקבל את ההתראות.
בנוסף להגדרת השרת שמתוארת במדריך הזה, לקבלת התראות צריך גם להעניק את ההרשאות המתאימות ולבצע הגדרות נוספות משימות שונות במסוף Google API. צפייה הפעלת התראות של EMM לקבלת פרטים.
מידע נוסף על Google Cloud Pub/Sub, כולל דוגמאות, זמין בכתובת מסמכי תיעוד של Cloud Pub/Sub
ניתן להגדיר את המערכת כך שההתראות יישלחו אל בנקודת הקצה מסוג HTTPS, או לשרת שממתין לשליחת התראות.
מידע על ההגדרה של נקודות הקצה בדחיפה
כדי להגדיר נקודת קצה לדחיפה, צריך שרת עם אישור SSL בתוקף. לחשבון בדוגמה הזו, יוצרים ומעלים אישור SSL לרשות אישורים. (CA), ואז להגדיר את שרת NGINX. לבסוף, מהדר ומריץ את קוד הבדיקה מוודאים שההגדרה שלכם נכונה.
הדוגמה הזו מראה איך להגדיר
שרת NGINX ב-
מצב שרת proxy הפוך כדי להתחבר לאפליקציית המנויים (בPushSubscriber.java)
שפועלת ביציאה 8093, עם Ubuntu 14.04. הארגון שלך עשוי להשתמש בפורמט אחר
אבל ההגדרות לדוגמה אמורות לפעול, ללא שינויים, בכל הפלטפורמות
של הסבירות. התפלגויות אחרות (למשל שמבוססות על RedHat) דומות,
אבל המיקום של קובצי התצורה עשוי להיות שונה.
כדי לקבל התראות, צריך להגדיר נקודת קצה (endpoint) עומד בקריטריונים הבאים:
עליך להיות הבעלים של הדומיין ולאמת את הבעלות שלך ב- מסוף Google API.
נדרשת אפשרות להפעיל שירות ביציאה 443 (SSL).
צריך אישור SSL בחתימה של רשות האישורים. אישורים עם חתימה עצמית לא פועלים.
שרת האינטרנט שמופעל חייב לתמוך בתמיכה webhooks.
נקודת הקצה (endpoint) לא צריכה לרוץ ב-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 שלך. התהליך המדויק
תלויות בקנדה, אבל הן יכללו את השלבים הבאים:
- צריך להעלות את קובץ ה-CMS לאתר ה-CA או להדביק את תוכן הקובץ באתר של ה-CA. לאחר מכן, רשות האישורים מאמתת ומעבדת את הנתונים האלה.
- מורידים את האישור החתום שנוצר על ידי ה-CA.
6. הפלט מרשות האישורים (CA) צריך להכיל מספר קבצים:
את האישור עצמו ואת האישור של ה-CA שמאשר שהם עומדים בדרישות.
אישורי החתימה. משרשרים (במחרוזת) את כל *.crt קובצי האישורים בקובץ שהורדתם
להיכנס לקובץ חבילה יחיד, לדוגמה: bundle.push.solarmora.com.crt:
$ cat *.crt > bundle.push.solarmora.com.crt
הגדרת שרת ה-proxy
בקטע הזה מגדירים את שרת האינטרנט NGINX בקוד פתוח שרת proxy שנועד לשרת את נקודת הקצה ולהעביר את כל הבקשות הנכנסות אל שרת המנויים. אפשר להשתמש ב-NGINX כדוגמה, במקום זאת, שרת ה-proxy ל-HTTP.
1. מתקינים את NGINX בשרת:
$ sudo apt-get update
$ sudo apt-get install nginx
$ nginx -v
$ nginx version: nginx/1.4.6 (Ubuntu)
2. כדי לוודא את הקבצים הנוספים של שכבת הצירוף של השרת שאתם יוצרים ב
הספרייה sites-enabled מעובדת על ידי NGINX, עריכה של /etc/nginx/nginx.conf
וכוללים את הפרטים הבאים:
$ include /etc/nginx/conf.d/*.conf;
$ include /etc/nginx/sites-enabled/*;
3. מעתיקים את קובצי האישורים למקום בטוח, שאפשר לקרוא אותם באמצעות
משתמש אחד (www-data), אבל עדיף שלא יהיה קריא על ידי אף משתמש אחר (ייתכן שיהיה עליך
כדי לשנות את שם המשתמש אם שרת האינטרנט שלך פועל
user):
$ 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>
זו התגובה הצפויה, כי לא הוגדר שרת downstream
(localhost:8093 בקובץ התצורה שלנו).
הידור והרצה של דוגמאות
כדי להריץ את הדוגמאות בקטע הזה, נדרש Google API Console פעיל פרויקט. מומלץ ליצור חשבון במיוחד למטרות בדיקה, צריך להפריד אותו מפרויקט הייצור. אחרי שיוצרים פרויקט בדיקה: צריך ליצור חשבון שירות. רושמים בצד את כתובת האימייל של חשבון השירות ושומרים את קובץ ה- .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 וגם המהדר של מאגרי הפרוטוקולים של 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. ודאו שהקוד שלכם עדכני ועבר הידור (compile), ולאחר מכן הריצו את קוד בדיקת מנוי:
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
}