מערכת 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 }