سرور را برای اعلان های فشاری راه اندازی کنید

Google Play در پاسخ به رویدادهایی که رخ می‌دهند و می‌توانند بر یک شرکت تأثیر بگذارند، اعلان‌هایی تولید می‌کند. ارائه دهندگان راه حل EMM می توانند این اعلان ها را دریافت کرده و به عنوان مثال با ارائه هشدارها یا مکانیسم های دیگر برای مدیران مشتریان خود، بر اساس آنها عمل کنند.

این راهنما به شما می گوید که چگونه زیرساخت سرور مورد نیاز برای دریافت و پردازش اعلان های فشار EMM را پیکربندی کنید. اعلان‌های کششی به تنظیماتی که در این راهنما توضیح داده شده است نیاز ندارند.

علاوه بر راه‌اندازی سرور که در این راهنما توضیح داده شده است، برای اعلان‌های فشاری نیز باید امتیازات مناسب را اعطا کنید و سایر وظایف پیکربندی را در کنسول API Google انجام دهید. برای جزئیات بیشتر به فعال کردن اعلان‌های فشار EMM مراجعه کنید.

برای اطلاعات بیشتر درباره Google Cloud Pub/Sub، از جمله مثال‌ها، به مستندات Cloud Pub/Sub مراجعه کنید.

می‌توانید سیستم خود را طوری پیکربندی کنید که اعلان‌های فشاری به یک نقطه پایانی مشخص شده HTTPS یا به سروری که منتظر ارسال اعلان‌ها است ارسال شود.

درباره پیکربندی نقطه پایانی فشار

برای پیکربندی یک نقطه پایانی فشار، به سروری با گواهینامه SSL معتبر نیاز دارید. در این مثال، شما یک گواهی SSL را در یک مرجع گواهی (CA) ایجاد و آپلود می‌کنید، سپس سرور NGINX را پیکربندی می‌کنید. در نهایت کد تست را کامپایل و اجرا می کنید تا تأیید کنید که تنظیمات شما درست است.

این مثال نحوه پیکربندی سرور NGINX را در حالت پروکسی معکوس برای اتصال به برنامه مشترک (در PushSubscriber.java ) که روی پورت 8093 اجرا می‌شود، با استفاده از اوبونتو 14.04 نشان می‌دهد. شرکت شما ممکن است از سرور دیگری استفاده کند، اما راه‌اندازی نمونه باید بدون تغییر در همه توزیع‌های مبتنی بر دبیان کار کند. سایر توزیع ها (مانند توزیع های مبتنی بر RedHat) مشابه هستند، اما محل فایل های پیکربندی ممکن است متفاوت باشد.

قبل از اینکه بتوانید اعلان‌ها را دریافت کنید، باید نقطه پایانی را پیکربندی کنید که معیارهای زیر را داشته باشد:

  • شما باید مالک دامنه باشید و مالکیت خود را در Google API Console تأیید کنید.

  • شما باید بتوانید سرویسی را روی پورت 443 (SSL) اجرا کنید.

  • شما باید یک گواهی SSL با امضای CA داشته باشید. گواهی های خودامضا کار نمی کند.

  • وب سروری که در حال اجرا هستید باید از webhooks پشتیبانی کند.

لازم نیست نقطه پایانی شما در 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 خود آپلود کنید. فرآیند دقیق به CA شما بستگی دارد، اما شامل مراحل زیر است:

  1. فایل CSR خود را در سایت CA خود آپلود کنید یا محتوای فایل خود را در سایت CA خود قرار دهید. سپس CA شما این داده ها را تأیید و پردازش می کند.
  2. گواهی امضا شده تولید شده توسط CA خود را دانلود کنید.

6. خروجی CA باید حاوی چندین فایل باشد: خود گواهی امضا شده و گواهی 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. برای اطمینان از اینکه فایل‌های پیکربندی سرور اضافی که در فهرست 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 جدید ایجاد کنید. 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 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. در سیستم های مبتنی بر دبیان، هم 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
اگر اینطور نیست، می‌توانید protoc pom.xml یا symlink را تغییر دهید:
    $ 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 }
یک پیام به درستی دریافت و پردازش شده است.