ตั้งค่าเซิร์ฟเวอร์สำหรับข้อความ Push

Google Play สร้างการแจ้งเตือนเพื่อตอบสนองต่อเหตุการณ์ที่เกิดขึ้น และอาจส่งผลต่อองค์กร ผู้ให้บริการโซลูชัน EMM จะรับรายการเหล่านี้ได้ การแจ้งเตือนและดำเนินการกับการแจ้งเตือน โดยส่งการแจ้งเตือนหรือกลไกอื่นๆ สำหรับ ผู้ดูแลระบบของลูกค้า เป็นต้น

คู่มือนี้จะแสดงวิธีกำหนดค่าโครงสร้างพื้นฐานของเซิร์ฟเวอร์ที่จำเป็น เพื่อรับและประมวลผลข้อความPush ของ EMM เท่านั้น การแจ้งเตือนแบบพุลไม่จำเป็นต้องตั้งค่าตามรายละเอียดในคู่มือนี้

นอกเหนือจากการตั้งค่าเซิร์ฟเวอร์ที่อธิบายไว้ในคู่มือนี้แล้ว สำหรับข้อความ Push คุณต้องให้สิทธิ์ที่เหมาะสมและกำหนดค่าอื่นๆ งานในคอนโซล Google API โปรดดู เปิดใช้ข้อความ Push ของ EMM เพื่อดูรายละเอียด

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Cloud Pub/Sub รวมถึงตัวอย่างได้ที่ เอกสารประกอบ Cloud Pub/Sub

คุณสามารถกำหนดค่าระบบให้ส่งข้อความ Push ไปยัง อุปกรณ์ปลายทาง HTTPS ที่ระบุ หรือไปยังเซิร์ฟเวอร์ที่รอส่งการแจ้งเตือน

เกี่ยวกับการกำหนดค่าปลายทางพุช

หากต้องการกำหนดค่าปลายทางการพุช คุณต้องมีเซิร์ฟเวอร์ที่มีใบรับรอง SSL ที่ถูกต้อง ใน ในตัวอย่างนี้ คุณจะสร้างและอัปโหลดใบรับรอง SSL ไปยังผู้ออกใบรับรอง (CA) แล้วกำหนดค่าเซิร์ฟเวอร์ NGINX ขั้นตอนสุดท้าย ให้คุณคอมไพล์และเรียกใช้โค้ดทดสอบเพื่อ ยืนยันว่าการตั้งค่าของคุณถูกต้อง

ตัวอย่างนี้แสดงวิธีกำหนดค่า เซิร์ฟเวอร์ NGINX ใน โหมดพร็อกซีแบบย้อนกลับเพื่อเชื่อมต่อกับแอปผู้สมัครใช้บริการ (ใน PushSubscriber.java) ทำงานในพอร์ต 8093 โดยใช้ Ubuntu 14.04 องค์กรอาจใช้ แต่การตั้งค่าตัวอย่างควรใช้งานได้ โดยไม่มีการเปลี่ยนแปลง ใน Debian ทั้งหมด การกระจาย การกระจายอื่นๆ (เช่น การกระจายที่อิงจาก RedHat) จะคล้ายกัน แต่ตำแหน่งของไฟล์การกำหนดค่าอาจแตกต่างกัน

ก่อนที่จะรับการแจ้งเตือน คุณต้องกำหนดค่าปลายทางที่ ตรงตามเกณฑ์ต่อไปนี้

  • คุณต้องเป็นเจ้าของโดเมนและยืนยันการเป็นเจ้าของใน Google API Console

  • คุณต้องสามารถเรียกใช้บริการบนพอร์ต 443 (SSL)

  • คุณต้องมีใบรับรอง SSL ที่ลงชื่อโดย CA ใบรับรองที่ลงชื่อด้วยตนเองไม่สามารถใช้ได้

  • เว็บเซิร์ฟเวอร์ที่คุณใช้งานอยู่ต้องรองรับ เว็บฮุค

ปลายทางของคุณไม่จำเป็นต้องเรียกใช้บน Google App Engine (แต่ก็สามารถทำได้)

สร้างและอัปโหลดใบรับรอง SSL

1. สร้างใบรับรอง Secure Sockets Layer (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. เพื่อให้มั่นใจได้ว่าไฟล์การสร้างเซิร์ฟเวอร์ส่วนเกินที่คุณสร้างใน NGINX ประมวลผลไดเรกทอรี sites-enabled แล้ว แก้ไข /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 ที่ใช้งานอยู่ เราขอแนะนำให้คุณสร้างบัญชีเพื่อการทดสอบโดยเฉพาะ แยกโดเมนออกจากโปรเจ็กต์ที่ใช้งานจริง หลังจากสร้างโปรเจ็กต์ทดสอบแล้ว คุณต้องสร้างบัญชีบริการ จดอีเมลบัญชีบริการไว้ แล้ววางไฟล์ .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. ในระบบแบบ Debian ให้ติดตั้งทั้ง Maven และ เวลา คอมไพเลอร์ Protocol Buffers ของ Google:
    $ sudo apt-get install maven protobuf-compiler

3. ตรวจสอบว่าทั้ง Maven และคอมไพเลอร์ Protocol Buffers ของ 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 จะถือว่ามีการติดตั้งคอมไพเลอร์ Protocol Buffers ลงในไดเรกทอรี /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 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 }
ระบบได้รับและประมวลผลข้อความอย่างถูกต้องแล้ว