पुश नोटिफ़िकेशन के लिए सर्वर सेट अप करें

Google Play, होने वाले इवेंट के जवाब में सूचनाएं जनरेट करता है और किसी एंटरप्राइज़ पर असर डाल सकता है. ईएमएम सेवा देने वाली कंपनियों को ये सूचनाएं मिल सकती हैं. साथ ही, वे इन पर कार्रवाई कर सकते हैं. उदाहरण के लिए, वे ग्राहक एडमिन को सूचनाएं या अन्य तरीके उपलब्ध करा सकते हैं.

इस गाइड में आपको सिर्फ़ ईएमएम push सूचनाएं पाने और उन्हें प्रोसेस करने के लिए ज़रूरी सर्वर इंफ़्रास्ट्रक्चर कॉन्फ़िगर करने का तरीका बताया गया है. पुल की सूचनाओं के लिए, इस गाइड में बताए गए सेटअप की ज़रूरत नहीं होती.

इस गाइड में बताए गए सर्वर सेटअप के अलावा, पुश नोटिफ़िकेशन के लिए आपको Google API (एपीआई) कंसोल में उचित खास अधिकार देने होंगे और कॉन्फ़िगरेशन से जुड़े दूसरे काम भी करने होंगे. ज़्यादा जानकारी के लिए, ईएमएम पुश नोटिफ़िकेशन चालू करें देखें.

Google Cloud Pub/Sub के बारे में ज़्यादा जानकारी और उदाहरणों के लिए, Cloud Pub/Sub दस्तावेज़ देखें.

अपने सिस्टम को कॉन्फ़िगर किया जा सकता है, ताकि पुश नोटिफ़िकेशन किसी खास एचटीटीपीएस एंडपॉइंट या ऐसे सर्वर पर भेजे जाएं जो सूचनाएं भेजे जाने का इंतज़ार कर रहे हों.

पुश एंडपॉइंट के कॉन्फ़िगरेशन के बारे में जानकारी

पुश एंडपॉइंट को कॉन्फ़िगर करने के लिए, आपको मान्य एसएसएल सर्टिफ़िकेट वाले सर्वर की ज़रूरत होगी. इस उदाहरण में, एक एसएसएल सर्टिफ़िकेट बनाकर उसे किसी सर्टिफ़िकेट अथॉरिटी (CA) पर अपलोड किया जाता है. इसके बाद, NGINX सर्वर को कॉन्फ़िगर किया जाता है. आखिर में, टेस्ट कोड को कंपाइल करके चलाएं, ताकि यह पक्का हो सके कि आपका सेटअप सही है.

इस उदाहरण में बताया गया है कि Ubuntu 14.04 का इस्तेमाल करके, पोर्ट 8093 पर चलने वाले सदस्यता ऐप्लिकेशन (PushSubscriber.java में) से कनेक्ट करने के लिए, NGINX सर्वर को रिवर्स प्रॉक्सी मोड में कैसे कॉन्फ़िगर करें. आपका एंटरप्राइज़ किसी दूसरे सर्वर का इस्तेमाल कर सकता है, लेकिन नमूने का सेटअप बिना किसी बदलाव के काम करता होगा. यह काम सभी Debian-आधारित डिस्ट्रिब्यूशन पर काम करेगा. अन्य डिस्ट्रिब्यूशन (जैसे कि RedHat पर आधारित) मिलते-जुलते होते हैं, लेकिन कॉन्फ़िगरेशन फ़ाइलों की जगह अलग हो सकती है.

सूचनाएं पाने से पहले, आपको ऐसा एंडपॉइंट कॉन्फ़िगर करना होगा जो नीचे दी गई शर्तों को पूरा करता हो:

  • आपके पास डोमेन का मालिकाना हक होना चाहिए. साथ ही, Google API (एपीआई) कंसोल में अपने मालिकाना हक की पुष्टि करनी चाहिए.

  • आपके पास पोर्ट 443 (एसएसएल) पर सेवा चलाने की अनुमति होनी चाहिए.

  • आपके पास CA-हस्ताक्षर किया गया SSL प्रमाणपत्र होना चाहिए. खुद हस्ताक्षर किए हुए सर्टिफ़िकेट काम नहीं करते.

  • यह ज़रूरी है कि आप जिस वेब सर्वर को चला रहे हैं उसमें वेबहुक की सुविधा काम करती हो.

आपके एंडपॉइंट को Google App Engine पर चलाने की ज़रूरत नहीं है (हालांकि, यह हो सकता है).

एसएसएल सर्टिफ़िकेट बनाना और अपलोड करना

1. सिक्योर सॉकेट लेयर (एसएसएल) सर्टिफ़िकेट बनाना:

    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. इस सर्टिफ़िकेट पर हस्ताक्षर करने के लिए, एक सर्टिफ़िकेट साइनिंग अनुरोध (सीएसआर) दें, ताकि उसे हस्ताक्षर करने वाले व्यक्ति को अपलोड किया जा सके:

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. पक्का करें कि सीएसआर फ़ाइल का कॉन्टेंट इस तरह दिखे:

    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. अपनी सीएसआर फ़ाइल को अपनी सीए साइट पर अपलोड करें या अपनी फ़ाइल का कॉन्टेंट अपनी सीए साइट पर चिपकाएं. इसके बाद, आपका सीए इस डेटा की पुष्टि करता है और उसे प्रोसेस करता है.
  2. हस्ताक्षर किए गए उस सर्टिफ़िकेट को डाउनलोड करें जिसे आपके CA ने जनरेट किया है.

6. सीए के आउटपुट में कई फ़ाइलें होनी चाहिए: हस्ताक्षर किए गए सर्टिफ़िकेट और सीए का सर्टिफ़िकेट, इस बात की पुष्टि करता है कि वे सर्टिफ़िकेट पर हस्ताक्षर करने की ज़रूरी शर्तें पूरी करते हैं. डाउनलोड किए गए बंडल में मौजूद सभी *.crt सर्टिफ़िकेट फ़ाइलों को एक बंडल फ़ाइल में रखें, जैसे कि bundle.push.solarmora.com.crt:

$ cat *.crt > bundle.push.solarmora.com.crt

अपना प्रॉक्सी सर्वर कॉन्फ़िगर करें

इस सेक्शन में, NGINX ओपन सोर्स वेब सर्वर और रिवर्स प्रॉक्सी सर्वर को कॉन्फ़िगर किया जा सकता है, ताकि एंडपॉइंट को सेवा दी जा सके और आने वाले सभी अनुरोधों को सदस्य के सर्वर पर भेजा जा सके. उदाहरण के तौर पर, NGINX का इस्तेमाल किया गया है. हालांकि, आपके पास किसी दूसरे एचटीटीपी प्रॉक्सी का इस्तेमाल करने का भी विकल्प है.

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 उपयोगकर्ता पढ़ सके. हालांकि, आम तौर पर इसे कोई दूसरा उपयोगकर्ता नहीं पढ़ सकता. अगर आपका वेब सर्वर किसी और उपयोगकर्ता के तौर पर चल रहा है, तो आपको उपयोगकर्ता नाम में बदलाव करना पड़ सकता है:

    $ 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 का नया कॉन्फ़िगरेशन बनाएं. /etc/nginx/sites-enabled में push.solarmora.com में बदलाव करें और फ़ाइल के नाम के तौर पर अपने असल सर्वर के पूरी तरह क्वालिफ़ाइड डोमेन नेम का इस्तेमाल करें:

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. डेबियन सिस्टम पर, 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 के हिसाब से, प्रोटोकॉल बफ़र कंपाइलर, /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 ईएमएम एपीआई से भेजे गए मैसेज को एम्युलेट किया जा सकता है.

    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 }
मैसेज सही तरीके से मिल गया है और उसे प्रोसेस कर दिया गया है.