Google Play tạo thông báo để phản hồi các sự kiện xảy ra và có thể ảnh hưởng đến doanh nghiệp. Nhà cung cấp giải pháp EMM có thể nhận được những thông báo này và xử lý các thông báo đó, chẳng hạn như đưa ra cảnh báo hoặc các cơ chế khác cho quản trị viên của khách hàng.
Hướng dẫn này cho bạn biết cách định cấu hình cơ sở hạ tầng máy chủ cần thiết để chỉ nhận và xử lý các thông báo push của EMM. Tính năng thông báo kéo không yêu cầu bạn phải thiết lập được nêu chi tiết trong hướng dẫn này.
Ngoài cách thiết lập máy chủ như mô tả trong hướng dẫn này, đối với thông báo đẩy, bạn cũng phải cấp các đặc quyền thích hợp và thực hiện các tác vụ định cấu hình khác trong Bảng điều khiển API của Google. Hãy xem phần Bật thông báo đẩy của EMM để biết thông tin chi tiết.
Để biết thêm thông tin về Google Cloud Pub/Sub, bao gồm cả các ví dụ, hãy xem tài liệu về Cloud Pub/Sub.
Bạn có thể định cấu hình hệ thống để gửi thông báo đẩy đến điểm cuối HTTPS đã chỉ định hoặc đến máy chủ đang chờ gửi thông báo.
Giới thiệu về cấu hình điểm cuối đẩy
Để định cấu hình điểm cuối đẩy, bạn cần có máy chủ có chứng chỉ SSL hợp lệ. Trong ví dụ này, bạn tạo và tải một chứng chỉ SSL lên một tổ chức phát hành chứng chỉ (CA), sau đó định cấu hình máy chủ NGINX. Cuối cùng, bạn biên dịch và chạy mã kiểm thử để xác nhận rằng chế độ thiết lập của bạn là chính xác.
Ví dụ này cho biết cách định cấu hình máy chủ NGINX ở chế độ proxy ngược để kết nối với ứng dụng của người đăng ký (trong PushSubscriber.java
) chạy trên cổng 8093, sử dụng Ubuntu 14.04. Doanh nghiệp của bạn có thể sử dụng một máy chủ khác, nhưng quy trình thiết lập mẫu sẽ hoạt động mà không cần thay đổi trên tất cả các bản phân phối dựa trên Debian. Các bản phân phối khác (chẳng hạn như các bản phân phối dựa trên RedHat) tương tự nhau, nhưng vị trí của các tệp cấu hình có thể khác nhau.
Để có thể nhận thông báo, bạn phải định cấu hình một điểm cuối đáp ứng các tiêu chí sau:
Bạn phải sở hữu miền và xác minh quyền sở hữu trong Google API Console.
Bạn phải chạy dịch vụ trên cổng 443 (SSL).
Bạn phải có chứng chỉ SSL được ký bởi CA. Chứng chỉ tự ký không hoạt động.
Máy chủ web mà bạn đang chạy phải hỗ trợ webhook.
Điểm cuối của bạn không cần phải chạy trên Google App Engine (mặc dù có thể chạy trên Google App Engine).
Tạo và tải chứng chỉ SSL lên
1. Tạo chứng chỉ Lớp cổng bảo mật (SSL):
myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \ -newkey rsa:2048 -keyout cert.key -out cert.crt
Thao tác này sẽ tạo ra phản hồi sau. Thay thế các giá trị mẫu (chẳng hạn như push.solarmora.com
và myusername@myhost
) bằng tên máy chủ, công ty, địa chỉ thực tế của bạn, v.v. trong mã sau. Bạn có thể sử dụng bất kỳ miền con nào miễn là bản ghi A
của miền con này trỏ đến máy chủ của bạn.
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. Xác minh rằng tệp chứng chỉ đã được tạo:
$ myusername@myhost:/tmp$ ls cert*
cert.crt cert.key
3. Để ký chứng chỉ này, hãy tạo yêu cầu ký chứng chỉ (CSR) để tải lên trình ký của bạn:
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. Đảm bảo rằng nội dung của tệp CSR như sau:
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. Tải một phần của chứng chỉ lên CA của bạn giữa các dòng BEGIN
và END
. Quy trình chính xác sẽ phụ thuộc vào CA của bạn nhưng sẽ bao gồm các bước sau:
- Tải tệp CSR lên trang web CA hoặc dán nội dung tệp vào trang web CA của bạn. Sau đó, CA của bạn sẽ xác thực và xử lý dữ liệu này.
- Tải chứng chỉ đã ký do CA của bạn tạo xuống.
6. Kết quả của CA phải chứa nhiều tệp: chính chứng chỉ đã ký và chứng chỉ của CA xác nhận rằng họ đủ điều kiện ký chứng chỉ. Ghép tất cả tệp chứng chỉ *.crt
trong gói đã tải xuống thành một tệp gói duy nhất, ví dụ: bundle.push.solarmora.com.crt
:
$ cat *.crt > bundle.push.solarmora.com.crt
Định cấu hình máy chủ proxy
Trong phần này, bạn sẽ định cấu hình máy chủ web nguồn mở NGINX và máy chủ proxy ngược để phân phát điểm cuối và chuyển tiếp tất cả yêu cầu đến tới máy chủ người đăng ký. NGINX được dùng làm ví dụ, nhưng bạn cũng có thể sử dụng bất kỳ proxy HTTP nào khác.
1. Cài đặt NGINX trên máy chủ của bạn:
$ sudo apt-get update $ sudo apt-get install nginx $ nginx -v $ nginx version: nginx/1.4.6 (Ubuntu)
2. Để đảm bảo rằng các tệp cấu hình máy chủ bổ sung mà bạn tạo trong thư mục sites-enabled
đều được NGINX xử lý, hãy chỉnh sửa /etc/nginx/nginx.conf
và thêm các đoạn mã sau:
$ include /etc/nginx/conf.d/*.conf; $ include /etc/nginx/sites-enabled/*;
3. Sao chép các tệp chứng chỉ của bạn vào một vị trí an toàn mà người dùng www-data
có thể đọc được, nhưng tốt nhất là không người dùng nào khác đọc được (bạn có thể cần phải điều chỉnh tên người dùng nếu máy chủ web của bạn đang chạy dưới dạng một người dùng khác):
$ 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. Tạo cấu hình server
mới. Chỉnh sửa push.solarmora.com
trong /etc/nginx/sites-enabled
và sử dụng tên miền đủ điều kiện của máy chủ thực tế làm tên tệp:
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. Khởi động lại NGINX để triển khai các thay đổi:
myusername@myhost:/etc/nginx$ sudo service nginx restart * Restarting nginx nginx ...done.
6. Máy chủ của bạn hiện đã được định cấu hình. Để xác minh cấu hình, hãy thử truy vấn máy chủ của bạn bằng 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>
Đây là phản hồi dự kiến vì chưa có máy chủ hạ nguồn nào được định cấu hình (localhost:8093
trong tệp cấu hình của chúng tôi).
Biên dịch và chạy ví dụ
Để chạy các ví dụ trong phần này, bạn cần có một dự án Google API Console đang hoạt động. Bạn nên tạo một mô hình dành riêng cho mục đích kiểm thử và tách biệt dự án đó với dự án phát hành chính thức. Sau khi tạo dự án thử nghiệm, bạn cần tạo một tài khoản dịch vụ. Ghi lại địa chỉ email của tài khoản dịch vụ và đặt tệp .p12 được liên kết ở vị trí nào đó trên máy chủ của bạn.
Thiết lập cây mã nguồn
1. Sao chép kho lưu trữ 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. Trên các hệ thống dựa trên Debian, hãy cài đặt cả Maven và trình biên dịch Google Protocol Buffers (Bộ đệm giao thức của Google):
$ sudo apt-get install maven protobuf-compiler
3. Xác minh rằng cả Maven và trình biên dịch Vùng đệm giao thức của Google đều được cài đặt đúng cách:
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. Tệp cấu hình Maven pom.xml
giả định rằng trình biên dịch Protocol Buffers (Vùng đệm giao thức) được cài đặt vào thư mục /usr/bin/protoc
:
myusername@myhost:~$ which protoc /usr/bin/protocNếu không phải như vậy, bạn có thể sửa đổi
pom.xml
hoặc đường liên kết tượng trưng protoc
:
$ sudo ln -s which protoc
/usr/bin/protoc
5. Biên dịch các ví dụ. Xác minh rằng bạn có thể tạo mã bằng cách chạy mvn clean compile assembly:single
. Thao tác này sẽ tạo một tệp có tên emm-notifications-[version-number]-jar-with-dependencies.jar
, trong đó [version number]
là phiên bản hiện tại của ví dụ, ví dụ: 1.0-SNAPSHOT
:myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/* target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar6. Xác minh rằng bạn có thể chạy mã
TestPublisher
đã biên dịch. Dự kiến mã sẽ không thành công:
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. Bạn phải ghi đè một số giá trị trong tệp settings.properties
. Để thực hiện việc này, hãy tạo một bản sao của tệp và sửa đổi các thuộc tính trong bản sao đó như sau:
# 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. Chạy lại mã TestPublisher
để đảm bảo mã không còn gặp sự cố. (Bạn có thể thấy một lỗi duy nhất trong dữ liệu đầu ra nhật ký.)
Chạy mã kiểm tra của nhà xuất bản
Bạn cần chạy mã mẫu để phát hành thông báo sao cho người đăng ký có một số thông báo cần đọc.
Trong ví dụ sau, mã tìm kiếm chủ đề được chỉ định trong my_settings.properties
nhưng không tìm thấy chủ đề đó, và do đó, mã sẽ tạo ra chủ đề.
Sau đó, Google sẽ đăng một thông báo về chủ đề đó. Ví dụ này cung cấp một công cụ kiểm thử có giá trị cho phép bạn mô phỏng thông báo do API EMM của Google Play gửi.
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}]}
Chạy mã thử nghiệm của người đăng ký
Mã kiểm thử người đăng ký xác nhận rằng bạn có thể nhận thông báo do mã TestPublisher
xuất bản.
1. Hãy đảm bảo rằng mã của bạn là mới nhất và được biên dịch, sau đó chạy mã kiểm thử cho gói thuê bao:
myusername@myhost:~/code/play-work/examples/emm-notifications$ DEVELOPER_CONSOLE_SETTINGS=./my_settings.propertiesGói thuê bao hiện đang chạy và sẵn sàng chấp nhận tin nhắn đến.
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. Chạy lại trình xuất bản, và các thông báo mới sẽ được thêm vào nhật ký:
Feb 27, 2015 1:47:24 PM com.google.android.work.emmnotifications.PushSubscriber$1 handle INFO: Raw request: {"message":{"data":"CjEKFQoIMTIzMjEzMjESCXJpZ2h0IG5vdxIWY29tLmdvb2dsZS5hbmRyb2lkLmdtcxgA",Thông báo đã được nhận và xử lý đúng cách.
"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 }