Push bildirimleri için sunucu kurulumu

Google Play meydana gelen etkinliklere yanıt olarak bildirimler oluşturur ve bir kurumu etkileyebilir. EMM çözüm sağlayıcıları bunları alabilir uyarılar veya başka mekanizmalar paylaşarak, bu e-postalarla ilgili yöneticileriyle bağlantı kurabilir.

Bu kılavuzda, gerekli sunucu altyapısını nasıl yapılandıracağınız açıklanmaktadır. Yalnızca EMM push bildirimlerini almak ve işlemek için. Getirme bildirimleri, bu kılavuzda ayrıntılı olarak açıklanan kurulum işlemini gerektirmez.

Bu kılavuzda açıklanan sunucu kurulumuna ek olarak, push bildirimleri için ayrıca uygun ayrıcalıkları vermeli ve diğer yapılandırma işlemlerini gerçekleştirmeniz Google API Konsolu'ndaki görevlere dönelim. Görüntüleyin EMM push bildirimlerini etkinleştirme inceleyebilirsiniz.

Örnekler dahil olmak üzere Google Cloud Pub/Sub hakkında daha fazla bilgi edinmek için Cloud Pub/Sub belgeleri.

Sisteminizi push bildirimlerinin bir HTTPS uç noktasına ya da bildirimlerin gönderilmesini bekleyen bir sunucuya gönderebilirsiniz.

Push uç noktası yapılandırması hakkında

Push uç noktası yapılandırmak için geçerli SSL sertifikası olan bir sunucuya ihtiyacınız vardır. İçinde Bu örnekte, bir SSL sertifikası oluşturup bunu bir sertifika yetkilisine (CA) açın, ardından NGINX sunucusunu yapılandırın. Son olarak da test kodunu derleyip çalıştırarak kurulumunuzun doğru olduğunu onaylayın.

Bu örnekte, bir öğeyi NGINX sunucusu: abone uygulamasına bağlanmak için ters proxy modu (PushSubscriber.java içinde) bağlantı noktası 8093'te çalıştırmaktır. İşletmeniz farklı bir sunucudur, ancak örnek kurulumun değişiklik yapılmadan tüm Debian tabanlı en iyi uygulamaları içerir. Diğer dağılımlar (RedHat'e dayalı olanlar gibi) benzerdir, ancak yapılandırma dosyalarının konumu farklı olabilir.

Bildirim almaya başlamadan önce, aşağıdaki özelliklere sahip bir uç nokta yapılandırmanız gerekir: şu ölçütleri karşılıyor:

  • Alanın sahibi olmanız ve Google API Konsolu.

  • 443 numaralı bağlantı noktası (SSL) üzerinden bir hizmeti çalıştırabiliyor olmanız gerekir.

  • CA imzalı bir SSL sertifikanız olmalıdır. Kendinden imzalı sertifikalar çalışmaz.

  • Çalıştırdığınız web sunucusu, webhook'lar gibi.

Uç noktanızın Google App Engine'de çalışması gerekmez (ancak çalıştırılabilir).

SSL sertifikası oluşturma ve yükleme

1. Güvenli Yuva Katmanı (SSL) sertifikası oluşturun:

    myusername@myhost:/tmp$ sudo openssl req -x509 -nodes -days 365 \
      -newkey rsa:2048 -keyout cert.key -out cert.crt

Bu işlem aşağıdaki yanıtı oluşturur. Örnek değerleri değiştirin (ör. push.solarmora.com ve myusername@myhost) gerçek sunucunuzla ad, şirket, adres vb. bilgileri aşağıdaki koda ekleyin. Herhangi bir olması koşuluyla, bu alt alan adının A kaydı sunucunuza işaret eder.

    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. Bir sertifika dosyasının oluşturulduğunu doğrulayın:

$ myusername@myhost:/tmp$ ls cert*
cert.crt  cert.key

3. Bu sertifikayı imzalatmak için sertifika imzalama isteği (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 dosyasının içeriğinin aşağıdaki gibi göründüğünden emin olun:

    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. Sertifikanızın bir bölümünü BEGIN ve CA'nıza END satır (dahil) eklendi. Tam süreç, CA'nıza bağlıdır ancak şu adımları içerir:

  1. CSR dosyanızı CA sitenize yükleyin veya dosyanızın içeriğini CA sitenize yapıştırın. Ardından CA'nız bu verileri doğrular ve işler.
  2. CA'nız tarafından oluşturulan imzalı sertifikayı indirin.

6. CA'dan alınan çıkış birden fazla dosya içermelidir: imzalı ve ilgili CA'nın sertifikasına göre, bu sertifikanın kendisi imzalar. İndirilen dosyadaki tüm *.crt sertifika dosyalarını birleştir paket, tek bir paket dosyasında toplanır (örneğin, bundle.push.solarmora.com.crt):

$ cat *.crt > bundle.push.solarmora.com.crt

Proxy sunucunuzu yapılandırma

Bu bölümde, NGINX açık kaynak web sunucusunu yapılandırıp uç noktayı sunmasını ve tüm gelen istekleri abone sunucusu. NGINX örnek olarak kullanılır, ancak HTTP proxy'yi seçin.

1. Sunucunuza NGINX'i yükleyin:

    $ sudo apt-get update
    $ sudo apt-get install nginx
    $ nginx -v
    $ nginx version: nginx/1.4.6 (Ubuntu)

2. Google Etiket Yöneticisi'nde oluşturduğunuz ek sunucu yapılandırma dosyalarının sites-enabled dizini NGINX tarafından işleniyor, /etc/nginx/nginx.conf öğesini düzenleyin ve aşağıdakileri ekleyin:

    $ include /etc/nginx/conf.d/*.conf;
    $ include /etc/nginx/sites-enabled/*;

3. Sertifika dosyalarınızı www-data kullanıcı tarafından okunamaz, ancak tercihen başka kullanıcılar tarafından okunamaz ( web sunucunuz farklı bir sunucu olarak çalışıyorsa, kullanıcı adını kullanı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. Yeni bir server yapılandırması oluşturun. push.solarmora.com öğesini düzenle /etc/nginx/sites-enabled ve gerçek sunucunun tam alan adını dosya adı olarak kullanın:

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. Değişiklikleri uygulamak için NGINX'i yeniden başlatın:

    myusername@myhost:/etc/nginx$ sudo service nginx restart
    * Restarting nginx nginx
    ...done.

6. Sunucunuz artık yapılandırılmış. Doğrulamak için yapılandırmasında curl kullanarak sunucunuzu sorgulamayı deneyin:

    [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>

Herhangi bir aşağı akış sunucusu yapılandırılmadığı için beklenen yanıt budur (yapılandırma dosyamızda localhost:8093).

Örnekleri derleyin ve çalıştırın

Bu bölümdeki örnekleri çalıştırmak için etkin bir Google API Konsolu'na ihtiyacınız vardır belirler. Test amacıyla özel olarak bir tane oluşturmanızı öneririz. ve üretim projenizden ayrı tutmaktır. Bir test projesi oluşturduktan sonra, Bir hizmet hesabı oluşturmanız gerekir. Hizmet hesabı e-posta adresini not edin ve ilişkili .p12 dosyasını sunucunuzda bir yere yerleştirin.

Kaynak kodu ağacını ayarlama

1. play-work.git deposunu klonlayın:

    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 tabanlı sistemlerde hem Maven hem de "the" Google Protokol Arabellekleri derleyicisi:
    $ sudo apt-get install maven protobuf-compiler

3. Maven ve Google Protokol Arabellekleri derleyicisinin doğru yüklü olduğundan emin olun:

    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 yapılandırma dosyası pom.xml, Protokol Arabellekleri derleyicisinin /usr/bin/protoc dizinine yüklendiğini varsayar:

    myusername@myhost:~$ which protoc
    /usr/bin/protoc
Böyle bir durum yoksa pom.xml öğesini veya protoc sembolik bağlantısını değiştirebilirsiniz:
    $ sudo ln -s which protoc /usr/bin/protoc
5.c Örnekleri derleyin. mvn clean compile assembly:single komutunu çalıştırarak kodu oluşturabildiğinizi doğrulayın. Bu işlem, emm-notifications-[version-number]-jar-with-dependencies.jar, burada: [version number], örneğin geçerli sürümüdür. Örneğin 1.0-SNAPSHOT:
    myusername@myhost:~/code/play-work/examples/emm-notifications$ ls target/*
    target/emm-notifications-1.0-SNAPSHOT-jar-with-dependencies.jar
6. Derlenen TestPublisher kodunu çalıştırabildiğinizi doğrulayın. Kodun başarısız olması beklenir:

    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 dosyasındaki bazı değerleri geçersiz kılmanız gerekir. Bunu yapmak için dosyanın bir kopyasını oluşturun ve kopyadaki özellikleri aşağıdaki gibi değiştirin:

    # 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. Kilitlenmemesinden emin olmak için TestPublisher kodunu tekrar çalıştırın. ( tek hata olabilir.)

Yayıncı test kodunu çalıştırma

Bildirimlerin yayınlanması için örnek kodu çalıştırmanız gerekir. Bu işlem abonenin okuyacağı bazı mesajlar var.

Aşağıdaki örnekte kod, konu my_settings.properties işlevinde belirtilmiş ancak bulamıyor; dolayısıyla, konu oluşturuyor. Ardından konuda bir mesaj yayınlar. Bu örnek, çok değerli bir Google Play EMM API'si tarafından gönderilen mesajları emüle etmenize olanak tanıyan test aracı

    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}]}

Abone test kodunu çalıştırma

Abone test kodu, Google Ads tarafından yayınlanan TestPublisher kodu.

1. Kodunuzun güncel ve derlenmiş olduğundan emin olduktan sonra abone test kodu:

    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" }
Abone şu anda çalışıyor ve gelen aramaları kabul etmeye hazır. mesaj.

2. Yayıncıyı tekrar çalıştırın. Yeni mesajlar günlüğe eklendi:

    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 }
Bir ileti düzgün şekilde alındı ve işlendi.