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