ضبط خادم للإشعارات الفورية

ينشئ Google Play إشعارات استجابةً للأحداث التي يتم إجراؤها ويمكن أن تؤثر على المؤسسة. ويمكن لموفّري حلول إدارة الخدمات الجوّالة للمؤسسات (EMM) تلقّي هذه الإشعارات والتصرف وفقًا لها، من خلال تقديم تنبيهات أو الآليات الأخرى مديري عملائهم، على سبيل المثال.

يخبرك هذا الدليل بكيفية ضبط البنية الأساسية للخادم تلقّي ومعالجة الإشعارات الفورية لإدارة الخدمات الجوّالة للمؤسسات (EMM) فقط. لا تتطلب إشعارات السحب الإعداد المفصّل في هذا الدليل.

بالإضافة إلى إعداد الخادم الموضح في هذا الدليل، فإن الإشعارات الفورية فيجب عليك أيضًا منح الامتيازات المناسبة وإجراء عمليات تهيئة المهام في وحدة التحكم في واجهة Google API. عرض تفعيل الإشعارات الفورية لإدارة الخدمات الجوّالة للمؤسسات (EMM) لمزيد من التفاصيل.

لمزيد من المعلومات حول Google Cloud Pub/Sub، بما في ذلك أمثلة، يُرجى الاطّلاع على مستندات Cloud Pub/Sub:

يمكنك ضبط نظامك بحيث يتم إرسال الإشعارات الفورية إلى نقطة نهاية HTTPS المحددة أو إلى خادم ينتظر إرسال الإشعارات.

لمحة عن إعداد نقاط النهاية الفورية

لإعداد نقطة نهاية إرسال، تحتاج إلى خادم يحتوي على شهادة طبقة مقابس آمنة (SSL) صالحة. ضِمن في هذا المثال، يمكنك إنشاء شهادة SSL وتحميلها إلى هيئة إصدار شهادات (CA)، ثم اضبط خادم NGINX. أخيرًا، تقوم بتجميع وتشغيل التعليمة البرمجية تأكَّد من صحة الإعداد.

يوضح هذا المثال كيفية ضبط خادم NGINX في وضع الخادم الوكيل العكسي للاتصال بتطبيق المشترك (في PushSubscriber.java) قيد التشغيل على المنفذ 8093، باستخدام نظام التشغيل Ubuntu 14.04. قد تستخدم مؤسستك واجهة برمجة تطبيقات ولكن يجب أن يعمل نموذج الإعداد بدون تغييرات، على جميع الأنظمة المستندة إلى Debian التوزيعات. تعتبر التوزيعات الأخرى (مثل تلك التي تستند إلى RedHat) مشابهة، ولكن قد يكون موقع ملفات التهيئة مختلفًا.

قبل أن تتمكن من تلقّي إشعارات، يجب إعداد نقطة نهاية تستوفي المعايير التالية:

  • يجب أن تكون مالكًا للنطاق وأن تُثبت ملكيته في وحدة التحكم في واجهة Google API:

  • يجب أن تكون قادرًا على تشغيل خدمة عبر المنفذ 443 (طبقة المقابس الآمنة).

  • يجب أن تتوفّر لديك شهادة طبقة مقابس آمنة (SSL) موقّعة من مرجع تصديق (CA). الشهادات الموقعة ذاتيًا لا تعمل.

  • يجب أن يتيح خادم الويب الذي تستخدمه دعمًا الردّ التلقائي على الويب:

لا تحتاج نقطة النهاية إلى التشغيل على Google App Engine (على الرغم من إمكانية ذلك).

إنشاء شهادة طبقة المقابس الآمنة (SSL) وتحميلها

1. إنتاج شهادة طبقة المقابس الآمنة (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. حمّل ملف CSR إلى موقع مرجع التصديق، أو الصق محتوى الملف على موقع مرجع التصديق. وعندئذٍ، يتحقق مرجع التصديق من صحة هذه البيانات ويعالجها.
  2. نزِّل الشهادة المُوقَّعة التي تم إنشاؤها بواسطة مرجع تصديق (CA).

6- يجب أن يحتوي الناتج من مرجع التصديق على ملفات متعددة: ملف الشهادة نفسها وشهادة المرجع المصدق (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.
2- على الأنظمة المستندة إلى Debian، يجب تثبيت كلّ من Maven الـ المحول البرمجي لـ Google Protocol Buffers:
    $ sudo apt-get install maven protobuf-compiler

3- تأكَّد من أنّ المحول البرمجي لـ Maven وGoogle Protocol Buffers مثبت بشكل صحيح:

    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. تأكد من أن التعليمة البرمجية محدثة ومجمّعة، ثم شغّل رمز اختبار المشترك:

    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 }
تم استلام رسالة ومعالجتها بشكل صحيح.