הגדרת השרת להתראות שנשלחות מהאפליקציה

מערכת 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 שלך. התהליך המדויק תלויות בקנדה, אבל הן יכללו את השלבים הבאים:

  1. צריך להעלות את קובץ ה-CMS לאתר ה-CA או להדביק את תוכן הקובץ באתר של ה-CA. לאחר מכן, רשות האישורים מאמתת ומעבדת את הנתונים האלה.
  2. מורידים את האישור החתום שנוצר על ידי ה-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.
2. במערכות שמבוססות על Debian, מתקינים גם את Maven וגם את האפליקציה ה מהדר מאגרי מאגרי פרוטוקולים של Google:
    $ 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
5. מכינים את הדוגמאות. כדי לוודא שאתם יכולים ליצור את הקוד, אתם צריכים להריץ את הפקודה 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
6. מוודאים שאפשר להריץ את קוד 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 }
הודעה התקבלה ועובדה כראוי.