Thiết lập máy chủ cho thông báo đẩy

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.commyusername@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 BEGINEND. 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:

  1. 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.
  2. 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ả Maventrì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/protoc
Nế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.jar
6. 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.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" }
Gói thuê bao hiện đang chạy và sẵn sàng chấp nhận tin nhắn đến.

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",
"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 }
Thông báo đã được nhận và xử lý đúng cách.