本文說明如何使用推播通知,在資源變更時通知應用程式。
總覽
Directory API 提供推播通知,可監控資源變更。您可以使用這項功能提升應用程式效能。這樣一來,您就不必輪詢資源來判斷資源是否已變更,進而省下額外的網路和運算費用。每當受監控的資源發生變化,Directory API 就會通知您的應用程式。
如要使用推播通知,請務必完成以下兩個動作:
設定接收網址或「Webhook」回呼接收端。
這是 HTTPS 伺服器,可處理資源變更時觸發的 API 通知訊息。
為要監看的每個資源端點設定通知管道。
管道會指定通知訊息的路由資訊。設定管道時,您必須指定要接收通知的特定網址。每當管道的資源發生變化,Directory API 就會以
POST要求的形式,將通知訊息傳送至該網址。
目前 Directory API 支援 Users 資源的異動通知。
建立通知管道
如要要求推播通知,您必須為要監控的每個資源設定通知管道。設定通知管道後,Directory API 會在任何監控資源變更時通知應用程式。
提出智慧手錶要求
每個可監看的 Directory API 資源都有相關聯的 watch 方法,URI 格式如下:
https://www.googleapis.com/API_NAME/API_VERSION/RESOURCE_PATH/watch
如要為特定資源的變更訊息設定通知管道,請向該資源的 watch 方法傳送 POST 要求。
每個通知管道都會與特定使用者和特定資源 (或一組資源) 建立關聯。除非目前使用者或服務帳戶擁有或有權存取這項資源,否則 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",
"type": "web_hook",
"address": "https://mydomain.com/notifications",
...
"token": "target=myApp-myFilesChannelDest",
"params": {
"ttl": 3600
}
}在要求主體中,提供頻道 id、type (設為 web_hook),以及 address 中的接收網址。您也可以選擇提供下列資訊:
- 做為頻道權杖的
token。 ttl,以秒為單位要求這個管道的存留時間。params
使用 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",
"type": "web_hook",
"address": "https://mydomain.com/notifications",
...
"token": "target=myApp-myFilesChannelDest",
"params": {
"ttl": 3600
}
}使用 customer 和 event 參數,指定客戶 Google 帳戶的專屬 ID,以及您要接收通知的事件類型。
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 個半形字元。針對這個頻道收到的每則通知訊息,您設定的 ID 值都會在
X-Goog-Channel-IdHTTP 標頭中回傳。 -
type屬性字串設為web_hook值。 -
address屬性字串,設為監聽及回應這個通知管道通知的網址。這是 Webhook 回呼網址,必須使用 HTTPS。請注意,只有在您的網頁伺服器上安裝有效的 SSL 憑證時,Directory API 才能將通知傳送至這個 HTTPS 位址。無效的憑證包括:
- 自行簽署的憑證。
- 由不受信任的來源所簽署的憑證。
- 已撤銷的憑證。
- 憑證的主體與目標主機名稱不符。
選用屬性
您也可以在 watch 要求中指定下列選填欄位:
-
token屬性,用於指定任意字串值做為管道權杖。通知管道權杖有多種用途,舉例來說,您可以利用這個權杖驗證每則傳入訊息是否屬於應用程式建立的管道,確保通知未遭偽造,或根據管道用途將訊息導向應用程式內的正確目的地。長度上限: 256 個半形字元。應用程式透過這個管道收到的每則通知訊息,都會在
X-Goog-Channel-TokenHTTP 標頭中包含權杖。如果您使用通知管道權杖,建議您採取下列行動:
使用可擴充的編碼格式,例如網址查詢參數。範例:
forwardTo=hr&createdBy=mobile請勿加入 OAuth 權杖等私密資料。
-
expiration屬性字串,設為您希望 Directory API 停止傳送這個通知管道訊息的日期和時間的 Unix 時間戳記 (以毫秒為單位)。如果管道設有到期時間,應用程式透過這個管道收到的每則通知訊息,都會在
X-Goog-Channel-ExpirationHTTP 標頭中包含到期時間值 (以人類可解讀的格式)。
如要進一步瞭解要求,請參閱 API 參考資料中「Users」資源的 watch 方法。
觀看回覆
如果 watch 要求成功建立通知管道,則會傳回 HTTP 200 OK 狀態碼。
手錶回應的訊息主體會提供您剛建立的通知管道相關資訊,如下列範例所示。
{
"kind": "api#channel",
"id": "01234567-89ab-cdef-0123456789ab",
"resourceId": "B4ibMJiIhTjAQd7Ff2K2bexk8G4",
"resourceUri": "https://admin.googleapis.com/admin/directory/v1/users?domain=domain&event=event",
"token": "target=myApp-myFilesChannelDest",
"expiration": 1384823632000
}回應主體會提供管道詳細資料,例如:
id:您為這個管道指定的 ID。resourceId:所監控資源的 ID。resourceUri:所監控資源的版本專屬 ID。token:要求主體中提供的權杖。expiration:以毫秒為單位的 Unix 時間戳記,代表頻道到期時間。
除了您在要求中傳送的屬性外,傳回的資訊也包含 resourceId 和 resourceUri,用於識別這個通知管道上監看的資源。
您可以將傳回的資訊傳遞至其他通知管道作業,例如停止接收通知。
同步訊息
建立通知管道來監控資源後,Directory API 會傳送 sync 訊息,表示通知即將開始。這些訊息的 X-Goog-Resource-State HTTP 標頭值為 sync。由於網路時間問題,您可能在收到 watch 方法回應之前,就收到 sync 訊息。
您可以放心忽略 sync 通知,但也可以使用這項功能。舉例來說,如果您決定要移除管道,可以在呼叫停止接收通知時使用 X-Goog-Channel-ID 和 X-Goog-Resource-ID 值。您也可以使用 sync 通知執行一些初始化作業,為後續事件做準備。
以下是 Directory API 傳送至接收網址的 sync 訊息格式。
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 內部限制或預設值決定 (系統會使用限制較嚴格的值)。如果頻道有到期時間,watch 方法傳回的資訊會包含該時間,格式為 Unix 時間戳記 (以毫秒為單位)。此外,應用程式透過 X-Goog-Channel-Expiration HTTP 標頭接收這個頻道的每則通知訊息時,都會附上到期日期和時間 (人類可讀格式)。
目前無法自動續訂通知管道。當頻道即將到期時,您必須呼叫 watch 方法,將頻道換成新的頻道。與往常一樣,新管道的 id 屬性必須使用專屬值。請注意,如果同一資源的兩個通知管道都處於啟用狀態,可能會出現「重疊」時間。
接收通知
每當監控的資源發生變化,應用程式就會收到描述變更內容的通知訊息。Directory API 會將這些訊息以 HTTPS POST 要求的形式,傳送至您為這個通知管道指定的 address 屬性網址。
解讀通知訊息格式
所有通知訊息都包含一組具有 X-Goog- 前置字串的 HTTP 標頭。部分類型的通知也可能包含訊息內文。
標頭
Directory API 發布至接收網址的通知訊息包含下列 HTTP 標頭:
| 標頭 | 說明 |
|---|---|
| 一律顯示 | |
|
您提供的 UUID 或其他專屬字串,用於識別這個通知管道。 |
|
整數,用於識別這個通知管道的這則訊息。sync 訊息的值一律為 1。頻道上每則後續訊息的訊息編號都會增加,但不會依序遞增。 |
|
用於識別受監控資源的不透明值。這個 ID 在各個 API 版本中都保持不變。 |
|
觸發通知的新資源狀態。
可能的值:
sync 或事件名稱。
|
|
受監控資源的 API 版本專屬 ID。 |
| 有時會出現 | |
|
通知管道的到期日期和時間,以人類可讀的格式表示。只有在定義時才會顯示。 |
|
應用程式設定的通知管道權杖,可用於驗證通知來源。只有在定義時才會顯示。 |
使用者通知訊息的要求主體包含下列資訊:
| 屬性 | 說明 |
|---|---|
kind |
表示這是使用者資源。值:固定字串「admin#directory#user」。 |
id |
使用者資源的專屬 ID。 |
etag |
通知訊息的 ETag。與使用者資源的 ETag 不同。 |
primaryEmail |
使用者的主要電子郵件地址。 |
範例
User 資源事件的通知訊息一般格式如下:
POST https://mydomain.com/notifications
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
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。
如果您的服務使用 Google API 用戶端程式庫,並傳回 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 用戶端 ID 識別) 才能停止頻道。
- 如果頻道是由服務帳戶建立,同一用戶端的任何使用者都可以停止頻道。
以下程式碼範例說明如何停止接收通知:
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"
}