ข้อความ Push

เอกสารนี้อธิบายวิธีใช้ Push Notification ที่แจ้งให้แอปพลิเคชันทราบเมื่อมีการเปลี่ยนแปลงทรัพยากร

ภาพรวม

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

หากต้องการใช้ข้อความ Push คุณต้องทํา 2 อย่างต่อไปนี้

  • ตั้งค่า URL ฝั่งที่รับหรือตัวรับการเรียกกลับ "เว็บฮุค"

    นี่คือเซิร์ฟเวอร์ HTTPS ที่จัดการข้อความการแจ้งเตือน API ที่ทริกเกอร์เมื่อทรัพยากรมีการเปลี่ยนแปลง

  • ตั้งค่า (ช่องทางการแจ้งเตือน) สําหรับปลายทางทรัพยากรแต่ละรายการที่ต้องการติดตาม

    ช่องจะระบุข้อมูลการกำหนดเส้นทางสำหรับข้อความการแจ้งเตือน คุณต้องระบุ URL ที่เฉพาะเจาะจงที่ต้องการรับการแจ้งเตือน ซึ่งเป็นส่วนหนึ่งของการตั้งค่าแชแนล เมื่อใดก็ตามที่ทรัพยากรของช่องมีการเปลี่ยนแปลง Directory API จะส่งข้อความแจ้งเป็นPOSTคำขอไปยัง URL นั้น

ปัจจุบัน Directory API รองรับการแจ้งเตือนการเปลี่ยนแปลงในทรัพยากร Users

สร้างช่องทางการแจ้งเตือน

หากต้องการขอรับข้อความ Push คุณต้องตั้งค่าช่องทางการแจ้งเตือนสำหรับแต่ละทรัพยากรที่ต้องการตรวจสอบ หลังจากตั้งค่าช่องทางการแจ้งเตือนแล้ว Directory API จะแจ้งให้แอปพลิเคชันทราบเมื่อทรัพยากรที่ตรวจสอบมีการเปลี่ยนแปลง

ส่งคำขอรับนาฬิกา

ทรัพยากร Directory API ที่รับชมได้แต่ละรายการจะมีวิธีการ watch ที่เชื่อมโยงกันในรูปแบบ URI ต่อไปนี้

https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch

หากต้องการตั้งค่าช่องทางการแจ้งเตือนสำหรับข้อความเกี่ยวกับการเปลี่ยนแปลงทรัพยากรหนึ่งๆ ให้ส่งคำขอ POST ไปยังเมธอด watch ของทรัพยากรนั้น

ช่องทางการแจ้งเตือนแต่ละช่องทางจะเชื่อมโยงกับผู้ใช้และทรัพยากร (หรือชุดทรัพยากร) ที่เฉพาะเจาะจง คำขอ watch จะดำเนินการไม่สำเร็จ เว้นแต่ผู้ใช้ปัจจุบันหรือบัญชีบริการจะเป็นเจ้าของหรือมีสิทธิ์เข้าถึงทรัพยากรนี้

ตัวอย่าง

คำขอติดตามทั้งหมดสำหรับทรัพยากร User ของโดเมนเดียวมีรูปแบบทั่วไปดังนี้

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=domain&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

ใช้พารามิเตอร์ domain และ event เพื่อระบุโดเมนและประเภทเหตุการณ์ที่คุณต้องการรับการแจ้งเตือน

คำขอดูทั้งหมดสำหรับทรัพยากรผู้ใช้สำหรับลูกค้าจะมีรูปแบบทั่วไปดังนี้

POST https://admin.googleapis.com/admin/directory/users/v1/watch?customer=customer&event=event
Authorization: Bearer auth_token_for_current_user
Content-Type: application/json

{
  "id": "01234567-89ab-cdef-0123456789ab", // Your channel ID.
  "type": "web_hook",
  "address": "https://mydomain.com/notifications", // Your receiving URL.
  ...
  "token": "target=myApp-myFilesChannelDest", // (Optional) Your channel token.
  "params": {
    "ttl": 3600 // (Optional) Your requested time-to-live for this channel.
  }
}

ใช้พารามิเตอร์ customer และ event เพื่อระบุรหัสที่ไม่ซ้ำกันของบัญชี Google ของลูกค้าและประเภทเหตุการณ์ที่คุณต้องการรับการแจ้งเตือน

ค่าที่เป็นไปได้สำหรับ event มีดังนี้

  • add: เหตุการณ์ที่ผู้ใช้สร้างขึ้น
  • delete: กิจกรรมที่ผู้ใช้ลบ
  • makeAdmin: กิจกรรมการเปลี่ยนแปลงสถานะผู้ดูแลระบบที่เป็นผู้ใช้
  • undelete: กิจกรรมที่ผู้ใช้ยกเลิกการลบ
  • update: กิจกรรมที่อัปเดตโดยผู้ใช้

หมายเหตุ: ตัวอย่างต่อไปนี้ไม่มีเนื้อหาคําขอเพื่อความชัดเจน

คอยดูเหตุการณ์ที่ผู้ใช้สร้างขึ้นสําหรับโดเมน mydomain.com

POST https://admin.googleapis.com/admin/directory/v1/users/watch?domain=mydomain.com&event=add

ตรวจสอบเหตุการณ์ที่ผู้ใช้สร้างขึ้นสำหรับลูกค้า my_customer

POST https://admin.googleapis.com/admin/directory/v1/users/watch?customer=my_customer&event=add

พร็อพเพอร์ตี้ที่จำเป็น

คุณต้องกรอกข้อมูลในช่องต่อไปนี้สำหรับคำขอ watch แต่ละรายการ

  • สตริงพร็อพเพอร์ตี้ id ที่ระบุช่องทางการแจ้งเตือนใหม่นี้ภายในโปรเจ็กต์ของคุณโดยไม่ซ้ำกัน เราขอแนะนำให้ใช้ตัวระบุที่ไม่ซ้ำกับผู้อื่น (UUID) หรือสตริงที่ไม่ซ้ำกันแบบอื่นๆ จำกัดความยาวสูงสุด 64 อักขระ

    ระบบจะแสดงค่ารหัสที่คุณตั้งไว้ในX-Goog-Channel-Idส่วนหัว HTTP ของข้อความการแจ้งเตือนทุกข้อความที่คุณได้รับสำหรับช่องนี้

  • สตริงพร็อพเพอร์ตี้ type ที่ตั้งค่าเป็นค่า web_hook

  • สตริงพร็อพเพอร์ตี้ address ที่ตั้งค่าเป็น URL ที่คอยฟังและตอบสนองต่อการแจ้งเตือนสําหรับช่องทางการแจ้งเตือนนี้ นี่คือ URL การเรียกกลับของ Webhook ของคุณ และต้องใช้ HTTPS

    โปรดทราบว่า Directory API จะส่งการแจ้งเตือนไปยังที่อยู่ HTTPS นี้ได้ก็ต่อเมื่อมีการติดตั้งใบรับรอง SSL ที่ถูกต้องในเว็บเซิร์ฟเวอร์เท่านั้น ใบรับรองที่ไม่ถูกต้องมีดังนี้

    • ใบรับรองแบบ Self-signed
    • ใบรับรองที่ลงนามโดยแหล่งที่มาที่ไม่น่าเชื่อถือ
    • ใบรับรองที่เพิกถอนไปแล้ว
    • ใบรับรองที่มีเรื่องไม่ตรงกับชื่อโฮสต์เป้าหมาย

พร็อพเพอร์ตี้ที่ไม่บังคับ

นอกจากนี้ คุณยังระบุฟิลด์ที่ไม่บังคับเหล่านี้พร้อมกับคำขอwatchได้ด้วย

  • พร็อพเพอร์ตี้ token ที่ระบุค่าสตริงแบบอิสระเพื่อใช้เป็นโทเค็นของช่อง คุณใช้โทเค็นช่องทางการแจ้งเตือนเพื่อวัตถุประสงค์ต่างๆ ได้ เช่น คุณสามารถใช้โทเค็นเพื่อยืนยันว่าข้อความขาเข้าแต่ละรายการมีไว้สำหรับช่องทางที่แอปพลิเคชันของคุณสร้างขึ้น เพื่อให้แน่ใจว่าไม่มีการปลอมแปลงการแจ้งเตือน หรือเพื่อกำหนดเส้นทางข้อความไปยังปลายทางที่เหมาะสมภายในแอปพลิเคชันตามวัตถุประสงค์ของช่องทางนี้ ความยาวสูงสุด: 256 อักขระ

    โทเค็นจะรวมอยู่ในX-Goog-Channel-Tokenส่วนหัว HTTP ของข้อความแจ้งเตือนทุกข้อความที่แอปพลิเคชันของคุณได้รับสำหรับแชแนลนี้

    หากคุณใช้โทเค็นช่องทางการแจ้งเตือน เราขอแนะนำให้ทำดังนี้

    • ใช้รูปแบบการเข้ารหัสที่ขยายได้ เช่น พารามิเตอร์การค้นหาของ URL ตัวอย่าง: forwardTo=hr&createdBy=mobile

    • อย่าใส่ข้อมูลที่ละเอียดอ่อน เช่น โทเค็น OAuth

  • สตริงพร็อพเพอร์ตี้ expiration ที่ตั้งค่าเป็นการประทับเวลา Unix (เป็นมิลลิวินาที) ของวันที่และเวลาที่คุณต้องการให้ Directory API หยุดส่งข้อความสำหรับช่องทางการแจ้งเตือนนี้

    หากช่องมีเวลาหมดอายุ ระบบจะรวมเวลาดังกล่าวเป็นค่าของX-Goog-Channel-Expirationส่วนหัว HTTP (ในรูปแบบที่มนุษย์อ่านได้) ในข้อความแจ้งเตือนทุกข้อความที่แอปพลิเคชันของคุณได้รับสำหรับช่องนี้

ดูรายละเอียดเพิ่มเติมเกี่ยวกับคําขอได้ที่เมธอด watch สําหรับทรัพยากร Users ในข้อมูลอ้างอิง API

ดูการตอบกลับ

หากคำขอ watch สร้างช่องทางการแจ้งเตือนสำเร็จ ระบบจะแสดงรหัสสถานะ HTTP 200 OK

เนื้อหาข้อความของการตอบกลับการดูจะให้ข้อมูลเกี่ยวกับแชแนลการแจ้งเตือนที่คุณเพิ่งสร้างขึ้น ดังที่แสดงในตัวอย่างด้านล่าง

{
  "kind": "api#channel",
  "id": "01234567-89ab-cdef-0123456789ab", // ID you specified for this channel.
  "resourceId": "B4ibMJiIhTjAQd7Ff2K2bexk8G4", // ID of the watched resource.
  "resourceUri": "https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event", // Version-specific ID of the watched resource.
  "token": "target=myApp-myFilesChannelDest", // Present only if one was provided.
  "expiration": 1384823632000, // Actual expiration time as Unix timestamp (in ms), if applicable.
}

นอกเหนือจากพร็อพเพอร์ตี้ที่คุณส่งมาเป็นส่วนหนึ่งของคำขอแล้ว ข้อมูลที่แสดงผลจะมี resourceId และ resourceUri เพื่อระบุทรัพยากรที่กำลังรับชมในแชแนลการแจ้งเตือนนี้ด้วย

คุณสามารถส่งข้อมูลที่แสดงผลไปยังการดำเนินการอื่นๆ ของช่องทางการแจ้งเตือนได้ เช่น เมื่อต้องการหยุดรับการแจ้งเตือน

ดูรายละเอียดเพิ่มเติมเกี่ยวกับการตอบกลับได้ที่watchวิธีสำหรับทรัพยากร Users ในข้อมูลอ้างอิง API

ซิงค์ข้อความ

หลังจากสร้างช่องทางการแจ้งเตือนเพื่อเฝ้าดูทรัพยากรแล้ว Directory API จะส่งข้อความ sync เพื่อระบุว่าการแจ้งเตือนกำลังจะเริ่มขึ้น ค่าส่วนหัว X-Goog-Resource-State HTTP สำหรับข้อความเหล่านี้คือ sync เนื่องจากปัญหาด้านเวลาของเครือข่าย คุณจึงอาจได้รับข้อความ sync ก่อนที่จะได้รับการตอบกลับของเมธอด watch

คุณไม่จำเป็นต้องสนใจการแจ้งเตือน sync แต่จะใช้ก็ได้ ตัวอย่างเช่น หากตัดสินใจว่าไม่ต้องการเก็บแชแนลไว้ คุณสามารถใช้ค่า X-Goog-Channel-ID และ X-Goog-Resource-ID ในการเรียกใช้เพื่อหยุดรับการแจ้งเตือน นอกจากนี้ คุณยังใช้การแจ้งเตือน sync เพื่อทำการเริ่มต้นบางอย่างเพื่อเตรียมพร้อมสําหรับเหตุการณ์ในภายหลังได้ด้วย

รูปแบบข้อความ sync ที่ Directory API ส่งไปยัง URL ที่คุณรับจะแสดงอยู่ด้านล่าง

POST https://mydomain.com/notifications // Your receiving URL.
X-Goog-Channel-ID: channel-ID-value
X-Goog-Channel-Token: channel-token-value
X-Goog-Channel-Expiration: expiration-date-and-time // In human-readable format. Present only if the channel expires.
X-Goog-Resource-ID: identifier-for-the-watched-resource
X-Goog-Resource-URI: version-specific-URI-of-the-watched-resource
X-Goog-Resource-State: sync
X-Goog-Message-Number: 1

ข้อความที่ซิงค์จะมีค่าส่วนหัว X-Goog-Message-Number HTTP เป็น 1 เสมอ การแจ้งเตือนแต่ละรายการที่ตามมาสำหรับช่องนี้จะมีหมายเลขข้อความที่มากกว่ารายการก่อนหน้า แม้ว่าหมายเลขข้อความจะไม่เรียงตามลำดับก็ตาม

ต่ออายุช่องทางการแจ้งเตือน

ช่องทางการแจ้งเตือนอาจมีเวลาหมดอายุ โดยค่าจะกำหนดโดยคำขอของคุณหรือขีดจำกัดภายในของ Directory API หรือค่าเริ่มต้น (ระบบจะใช้ค่าที่เข้มงวดกว่า) ระบบจะรวมเวลาหมดอายุของแชแนล (หากมี) ไว้ในการประทับเวลา Unix (เป็นมิลลิวินาที) ในข้อมูลที่เมธอด watch แสดงผล นอกจากนี้ ระบบจะใส่วันที่และเวลาหมดอายุ (ในรูปแบบที่มนุษย์อ่านได้) ไว้ในข้อความแจ้งเตือนทุกข้อความที่แอปพลิเคชันของคุณได้รับสำหรับแชแนลนี้ในส่วนหัว X-Goog-Channel-Expiration HTTP

ปัจจุบันยังไม่มีวิธีต่ออายุช่องทางการแจ้งเตือนอัตโนมัติ เมื่อช่องใกล้จะหมดอายุ คุณต้องแทนที่ด้วยช่องใหม่โดยเรียกใช้เมธอด watch คุณต้องระบุค่าที่ไม่ซ้ำกันสำหรับพร็อพเพอร์ตี้ id ของแชแนลใหม่ ดังเช่นเคย โปรดทราบว่าอาจมีระยะเวลาที่ "ทับซ้อนกัน" เมื่อช่องทางการแจ้งเตือน 2 ช่องทางสำหรับทรัพยากรเดียวกันทำงานอยู่

รับการแจ้งเตือน

เมื่อทรัพยากรที่ตรวจสอบมีการเปลี่ยนแปลง แอปพลิเคชันของคุณจะได้รับข้อความแจ้งเตือนที่อธิบายการเปลี่ยนแปลง Directory API จะส่งข้อความเหล่านี้เป็นคำขอ POST ผ่าน HTTPS ไปยัง URL ที่คุณระบุเป็นพร็อพเพอร์ตี้ address สำหรับช่องทางการแจ้งเตือนนี้

ตีความรูปแบบข้อความการแจ้งเตือน

ข้อความแจ้งเตือนทั้งหมดจะมีชุดส่วนหัว HTTP ที่มีคำนำหน้า X-Goog- การแจ้งเตือนบางประเภทอาจมีเนื้อหาข้อความด้วย

ส่วนหัว

ข้อความการแจ้งเตือนที่ Directory API โพสต์ไปยัง URL ที่คุณรับจะมีส่วนหัว HTTP ต่อไปนี้

ส่วนหัว คำอธิบาย
แสดงอยู่เสมอ
X-Goog-Channel-ID UUID หรือสตริงที่ไม่ซ้ำกันอื่นๆ ที่คุณระบุเพื่อระบุแชแนลการแจ้งเตือนนี้
X-Goog-Message-Number จำนวนเต็มที่ระบุข้อความนี้สำหรับช่องทางการแจ้งเตือนนี้ ค่าคือ 1 สำหรับข้อความ sync เสมอ หมายเลขข้อความจะเพิ่มขึ้นสำหรับข้อความแต่ละรายการในช่อง แต่จะไม่เรียงตามลำดับ
X-Goog-Resource-ID ค่าแบบทึบระบุทรัพยากรที่ดูอยู่ รหัสนี้มีความเสถียรในทุกเวอร์ชันของ API
X-Goog-Resource-State สถานะทรัพยากรใหม่ซึ่งทริกเกอร์การแจ้งเตือน ค่าที่เป็นไปได้มีดังนี้ sync หรือชื่อเหตุการณ์
X-Goog-Resource-URI ตัวระบุเฉพาะเวอร์ชัน API สําหรับทรัพยากรที่ดูอยู่
บางครั้งมี
X-Goog-Channel-Expiration วันที่และเวลาหมดอายุของช่องทางการแจ้งเตือนที่แสดงในรูปแบบที่มนุษย์อ่านได้ แสดงเฉพาะในกรณีที่มีการกําหนด
X-Goog-Channel-Token โทเค็นช่องทางการแจ้งเตือนที่แอปพลิเคชันของคุณตั้งค่าไว้และคุณใช้เพื่อยืนยันแหล่งที่มาของการแจ้งเตือนได้ แสดงเฉพาะในกรณีที่มีการกําหนด

ข้อความแจ้งเตือนสําหรับผู้ใช้จะมีข้อมูลต่อไปนี้ในส่วนเนื้อหาของคําขอ

พร็อพเพอร์ตี้ คำอธิบาย
kind ระบุว่าเป็นทรัพยากรของผู้ใช้ ค่า: สตริงแบบคงที่ "admin#directory#user"
id ตัวระบุที่ไม่ซ้ำกันของทรัพยากรผู้ใช้
etag ETag ของข้อความแจ้งเตือน แตกต่างจาก ETag ของทรัพยากรผู้ใช้
primaryEmail อีเมลหลักของผู้ใช้

ตัวอย่าง

ข้อความแจ้งเตือนสำหรับเหตุการณ์ทรัพยากร User มีรูปแบบทั่วไปดังนี้

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 0
X-Goog-Channel-ID: directoryApiId
X-Goog-Channel-Token: 398348u3tu83ut8uu38
X-Goog-Channel-Expiration: Tue, 29 Oct 2013 20:32:02 GMT
X-Goog-Resource-ID:  ret08u3rv24htgh289g
X-Goog-Resource-URI: 'https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event
X-Goog-Resource-State:  event
X-Goog-Message-Number: 10

{
  "kind": "admin#directory#user",
  "id": long,
  "etag": string,
  "primaryEmail": string
}

ตัวอย่างกิจกรรมที่ผู้ใช้ลบ

POST https://mydomain.com/notifications // Your receiving URL.
Content-Type: application/json; utf-8
Content-Length: 189
X-Goog-Channel-ID: deleteChannel
X-Goog-Channel-Token: 245t1234tt83trrt333
X-Goog-Channel-Expiration: Mon, 09 Dec 2013 22:24:23 GMT
X-Goog-Resource-ID:  B4ibMJiIhTjAQd7Ff2K2bexk8G4
X-Goog-Resource-URI: https://admin.googleapis.com/admin/directory/v1/users?domain=mydomain.com&event=delete&alt=json
X-Goog-Resource-State:  delete
X-Goog-Message-Number: 236440

{
  "kind": "admin#directory#user",
  "id": "111220860655841818702",
  "etag": "\"Mf8RAmnABsVfQ47MMT_18MHAdRE/evLIDlz2Fd9zbAqwvIp7Pzq8UAw\"",
  "primaryEmail": "user@mydomain.com"
}

ตอบสนองต่อการแจ้งเตือนต่างๆ

หากต้องการระบุความสําเร็จ ให้แสดงรหัสสถานะต่อไปนี้ 200, 201, 202, 204 หรือ 102

หากบริการของคุณใช้ไลบรารีไคลเอ็นต์ API ของ Google และแสดงผลเป็น 500,502, 503 หรือ 504 ทาง Directory API จะลองอีกครั้งโดยใช้การถดถอยแบบเลขชี้กำลัง รหัสสถานะการคืนสินค้าอื่นๆ ทั้งหมดจะถือว่าข้อความไม่สำเร็จ

ปิดการแจ้งเตือน

พร็อพเพอร์ตี้ expiration จะควบคุมเวลาที่การแจ้งเตือนจะหยุดโดยอัตโนมัติ คุณสามารถเลือกหยุดรับการแจ้งเตือนสำหรับบางช่องก่อนที่ช่องจะหมดอายุได้โดยเรียกใช้เมธอด stop ที่ URI ต่อไปนี้

https://www.googleapis.com/admin/directory_v1/channels/stop

วิธีนี้กำหนดให้คุณระบุพร็อพเพอร์ตี้ id และ resourceId ของช่องเป็นอย่างน้อย ดังที่แสดงในตัวอย่างด้านล่าง โปรดทราบว่าหาก Directory API มีทรัพยากรหลายประเภทที่มีเมธอด watch จะมีเมธอด stop เพียงเมธอดเดียว

เฉพาะผู้ใช้ที่มีสิทธิ์เท่านั้นที่จะหยุดช่องได้ โดยเฉพาะอย่างยิ่งฟีเจอร์ต่อไปนี้

  • หากบัญชีผู้ใช้ทั่วไปสร้างช่อง เฉพาะผู้ใช้รายเดียวกันจากไคลเอ็นต์เดียวกัน (ตามที่ระบุโดยรหัสไคลเอ็นต์ OAuth 2.0 จากโทเค็นการตรวจสอบสิทธิ์) ซึ่งสร้างช่องเท่านั้นที่จะหยุดช่องได้
  • หากช่องสร้างขึ้นโดยบัญชีบริการ ผู้ใช้ทุกคนจากไคลเอ็นต์เดียวกันจะหยุดช่องได้

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีหยุดรับการแจ้งเตือน

POST https://www.googleapis.com/admin/directory_v1/channels/stop
  
Authorization: Bearer CURRENT_USER_AUTH_TOKEN
Content-Type: application/json

{
  "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66",
  "resourceId": "ret08u3rv24htgh289g"
}