本文件將說明如何使用推播通知 並在資源變更時套用應用程式
總覽
Admin SDK API 提供推播通知 調整資源運用方式您可以使用這項功能改善應用程式效能。這可讓您消除與輪詢資源相關的額外網路和運算成本,以便判斷資源是否已變更。每當監控的資源發生變更,Admin SDK API 就會通知您的應用程式。
若要使用推播通知,您必須執行下列兩項操作:
設定接收網址或「Webhook」回呼接收接聽程式。
這個 是 HTTPS 伺服器,可處理 會在資源變更時觸發
管道會指定通知的轉送資訊 訊息。在管道設定中,您必須指定要接收通知的特定網址。只要頻道資源有所變更 Admin SDK API 會以
POST
的形式傳送通知訊息 要求至該網址
目前,Admin SDK API 支援 活動資源。
建立通知管道
如要請求推播通知,請設定通知管道 選擇要監控的資源設定通知管道後,Admin SDK API 會在任何監控資源變更時通知應用程式。
提出監控要求
每個可觀看的 Admin SDK API 資源都有一個相關聯的 watch
方法,位於下列格式的 URI:
https://www.googleapis.com/API_NAME /API_VERSION /RESOURCE_PATH /watch
若要設定通知管道,以便接收有關
請將 POST
要求傳送給
資源的 watch
方法。
每個通知管道都會與特定使用者和特定資源 (或一組資源) 建立關聯。watch
要求
就是目前的使用者
或服務帳戶
擁有這項資源的存取權,或有權存取這項資源。
範例
活動資源的所有觀看要求都會採用一般形式:
POST https://admin.googleapis.com/admin/reports/v1/activity/users/userKey or all /applications/applicationName /watch Authorization: Bearerauth_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. "payload": true, // (Optional) Whether to include the payload (message body) in notifications. "expiration": 3600 // (Optional) Your requested channel expiration time. }
您可以使用 userKey、applicationName、eventName
和 filters
參數,只接收特定事件、使用者或應用程式的通知。
注意:為了方便說明,以下範例省略了要求主體。
留意所有管理員活動:
POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin/watch
監控所有文件活動:
POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/docs/watch
監控特定使用者的管理員活動:
POST https://admin.googleapis.com/admin/reports/v1/activity/users/liz@example.com/applications/admin/watch
監控特定事件 (例如變更使用者密碼):
POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin/watch?eventName=CHANGE_PASSWORD
監控特定文件的變更:
POST https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/docs/watch?eventName=EDIT&filters==doc_id=123456abcdef
必要屬性
每個 watch
要求都必須提供下列欄位:
-
專門用於識別此項目的
id
屬性字串 新的通知管道建議您使用通用專屬 ID (UUID) 或任何類似的專屬字串。長度上限:64 個半形字元。您設定的 ID 值會在您透過這個管道收到的每則通知訊息的
X-Goog-Channel-Id
HTTP 標頭中回傳。 -
type
屬性字串設為web_hook
值。 -
address
屬性字串會設為網址,用於監聽及回應此通知管道的通知。這是 Webhook 回呼網址,且必須使用 HTTPS。請注意,只有在網路伺服器上安裝有效的 SSL 憑證時,Admin SDK API 才能將通知傳送至這個 HTTPS 位址。無效的憑證包括:
- 自行簽署的憑證。
- 由不受信任的來源所簽署的憑證。
- 已撤銷的憑證。
- 憑證與目標不符的憑證 主機名稱。
選用屬性
您也可以在 watch
要求中指定這些選用欄位:
-
指定任意字串的
token
屬性 值做為頻道符記。您可以使用通知管道 符記舉例來說,您可以使用 權杖,用於驗證每則傳入訊息的代表管道 應用程式建立元件,以確保使用者不會收到通知 或將此郵件轉送至該網路中的正確目的地 追蹤您的應用程式長度上限:256 個半形字元。這個權杖會納入應用程式透過此管道收到的每則通知訊息中的
X-Goog-Channel-Token
HTTP 標頭。如果你使用通知管道權杖,建議您:
使用可擴充的編碼格式,例如網址查詢參數。範例:
forwardTo=hr&createdBy=mobile
請勿加入 OAuth 權杖等機密資料。
-
將
expiration
屬性字串設為 Unix 時間戳記 您希望 Admin SDK API 發送的日期和時間 (以毫秒為單位) 停止傳送這個通知管道的訊息。如果管道設有到期時間,則在應用程式收到的每則管道通知訊息中,這項資訊會以
X-Goog-Channel-Expiration
HTTP 標頭的值 (以人類可讀格式呈現) 的形式加入。
如要進一步瞭解要求,請參閱 watch
方法。
針對 API 參考資料中的 Activities 資源。
觀看回應
如果 watch
要求成功建立通知
管道就會傳回 HTTP 200 OK
狀態碼。
手錶回應的訊息內文會提供 您剛剛建立的通知管道,如以下範例所示。
{ "kind": "api#channel", "id": "reportsApiId", // ID you specified for this channel. "resourceId": "o3hgv1538sdjfh", // ID of the watched resource. "resourceUri": "https://admin.googleapis.com/admin/reports/v1/activity/userKey /applications/applicationName ", // Version-specific ID of the watched resource. "token": "target=myApp-myFilesChannelDest", // Present only if one was provided. "expiration": 3600, // Actual expiration time as Unix timestamp (in ms), if applicable. }
除了您在要求中傳送的屬性之外,傳回的資訊還包含 resourceId
和 resourceUri
,用於識別這個通知管道中正在監控的資源。
您可以將傳回的資訊傳遞至其他通知管道 例如您想要停止接收 通知。
如要進一步瞭解回應,請參閱 API 參考資料中 Activities 資源的 watch
方法。
同步處理訊息
建立通知管道來監控資源後,Admin SDK API 會傳送 sync
訊息,指出通知已開始。這些訊息的 X-Goog-Resource-State
HTTP 標頭值為 sync
。由於網路時間問題,您可能會在收到 watch
方法回應之前,就收到 sync
訊息。
您可以放心忽略 sync
通知,但您可以放心
也能使用舉例來說,如果您不想保留管道,可以在呼叫中使用 X-Goog-Channel-ID
和 X-Goog-Resource-ID
值,停止接收通知。您也可以使用
sync
通知,用於進行一些初始化準備
之後的事件
以下是 Admin SDK 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
。這個頻道的所有後續通知
大於先前的訊息編號,但還是訊息編號
序列中的數字則無序
續訂通知管道
通知管道可以設定到期時間,而這個值是由您的要求或任何 Admin SDK API 內部限制或預設值決定 (會使用較嚴格的值)。頻道的有效期限
時間 (如果有的話),也會納入 Unix 時間戳記中
watch
方法傳回的資訊 (以毫秒為單位)。此外,應用程式在 X-Goog-Channel-Expiration
HTTP 標頭中,為此管道收到的每則通知訊息中,都會包含到期日和時間 (以人類可讀格式)。
目前目前無法自動續訂通知管道。當管道即將到期時,您必須呼叫 watch
方法,將其替換為新的管道。一如往常,您必須在
新頻道的 id
屬性。請注意,當同一個資源的兩個通知管道都處於作用中狀態時,可能會出現「重疊」的時間。
接收通知
每當已監控的資源變更時,應用程式就會收到
系統會發送通知訊息來說明變更Admin SDK API 會將
視為 HTTPS POST
要求,並對您所指定的網址
這則通知的 address
屬性
頻道。
解讀通知訊息格式
所有通知訊息都包含一組含有 X-Goog-
前置字串的 HTTP 標頭。某些類型的通知也可以包含訊息主體。
標頭
Admin SDK API 發布至接收網址的通知訊息包含下列 HTTP 標頭:
標頭 | 說明 |
---|---|
一律顯示 | |
|
UUID 或其他專屬字串,用來識別這個 ID 通知管道 |
|
用於識別此通知訊息的整數
頻道。sync 訊息的值一律為 1 。訊息
頻道後續訊息的成長率
順序。 |
|
識別受監控資源的不易解讀值。這個 ID 是 各個 API 版本皆保持穩定 |
|
觸發通知的新資源狀態。
可能的值:
sync 或事件名稱。
|
|
受監控資源的 API 版本專屬 ID。 |
有時會 | |
|
通知管道到期的日期和時間,以 人類可讀的格式只有在已定義的情況下才會顯示。 |
|
由應用程式設定的通知管道符記 並用於驗證通知來源出現以下情況時才會顯示 |
活動的通知訊息在要求主體中包含以下資訊:
屬性 | 說明 |
---|---|
kind |
並將其標示為活動資源。值:固定字串「admin#reports#activity 」。 |
id |
活動記錄的專屬識別碼。 |
id.time |
活動發生的時間。值採用 ISO 8601 日期和時間格式。時間為完整日期加上時、分、秒,格式為 YYYY-MM-DDTh:mm:ssTZD。例如:2010-04-05T17:30:04+01:00。 |
id.uniqueQualifier |
如果有多個事件發生在同一時間,則使用這個專屬限定條件。 |
id.applicationName |
事件所屬的應用程式名稱。可能的值包括: |
id.customerId |
Google Workspace 帳戶的專屬 ID。 |
actor |
使用者執行動作。 |
actor.callerType |
執行報表中列出活動的作者類型。在 API 中,callerType 是執行報表所列動作的 USER 或 OAuth 2LO 實體要求。 |
actor.email |
遭檢舉活動的使用者主要電子郵件地址。 |
actor.profileId |
使用者的專屬 Google Workspace 個人資料 ID。 |
ownerDomain |
管理控制台或文件應用程式的文件擁有者的網域。這是指受到報表事件影響的網域。 |
ipAddress |
執行動作的使用者 IP 位址。這是使用者登入 Google Workspace 時的網際網路通訊協定位址 (IP 位址),可能會反映使用者的實際位置,也可能不會。舉例來說,IP 位址可能是使用者 Proxy 伺服器的位址,也可能是虛擬私人網路 (VPN) 位址。這個 API 支援 IPv4 和 IPv6。 |
events[] |
報表中的活動事件。 |
events[].type |
事件類型。管理員變更的 Google Workspace 服務或功能會在 type 資源中識別,進而使用 eventName 屬性識別事件。 |
events[].name |
事件名稱。這是 API 所回報活動的專屬名稱。每項 eventName 都與特定 Google Workspace 服務或功能相關,這類 API 會依事件類型分類。
一般 eventName 要求參數:
|
events[].parameters[] |
各種應用程式的參數值組合。 |
events[].parameters[].name |
參數的名稱。 |
events[].parameters[].value |
參數的字串值。 |
events[].parameters[].intValue |
參數的整數值。 |
events[].parameters[].boolValue |
參數的布林值。 |
範例
活動資源事件的通知訊息一般格式如下:
POST https://mydomain.com/notifications // Your receiving URL. Content-Type: application/json; utf-8 Content-Length: 0 X-Goog-Channel-ID: reportsApiId 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/reports/v1/activity/userKey /applications/applicationName X-Goog-Resource-State:eventName X-Goog-Message-Number: 10 { "kind": "admin#reports#activity", "id": { "time":datetime , "uniqueQualifier":long , "applicationName":string , "customerId":string }, "actor": { "callerType":string , "email":string , "profileId":long }, "ownerDomain":string , "ipAddress":string , "events": [ { "type":string , "name":string , "parameters": [ { "name":string , "value":string , "intValue":long , "boolValue":boolean } ] } ] }
管理員活動事件範例:
POST https://mydomain.com/notifications // Your receiving URL. Content-Type: application/json; utf-8 Content-Length: 596 X-Goog-Channel-ID: reportsApiId X-Goog-Channel-Token: 245t1234tt83trrt333 X-Goog-Channel-Expiration: Tue, 29 Oct 2013 20:32:02 GMT X-Goog-Resource-ID: ret987df98743md8g X-Goog-Resource-URI: https://admin.googleapis.com/admin/reports/v1/activity/users/all/applications/admin?alt=json X-Goog-Resource-State: CREATE_USER X-Goog-Message-Number: 23 { "kind": "admin#reports#activity", "id": { "time": "2013-09-10T18:23:35.808Z", "uniqueQualifier": "-0987654321", "applicationName": "admin", "customerId": "ABCD012345" }, "actor": { "callerType": "USER", "email": "admin@example.com", "profileId": "0123456789987654321" }, "ownerDomain": "apps-reporting.example.com", "ipAddress": "192.0.2.0", "events": [ { "type": "USER_SETTINGS", "name": "CREATE_USER", "parameters": [ { "name": "USER_EMAIL", "value": "liz@example.com" } ] } ] }
根據通知內容採取行動
如要表示成功,您可以傳回下列任一狀態碼:
200
、201
、202
、204
或
102
。
如果您的服務使用 Google API 用戶端程式庫
並傳回 500
、502
、503
或 504
,亦即 Admin SDK API
以指數輪詢方式重試。
其他所有傳回狀態碼都視為郵件失敗。
瞭解 Admin SDK API 通知事件
本節詳細說明瞭您可操作的通知訊息 會收到透過 Admin SDK API 使用推播通知時接收的訊息。
Reports API 推播通知包含兩種類型的訊息:同步訊息和事件通知。郵件類型會顯示在 X-Goog-Resource-State
HTTP 標頭中。事件通知的可能值與 activities.list
方法相同。每個應用程式都有獨特的事件:
停止通知
expiration
屬性可控制自動停止通知的時間。您可以選擇在特定管道到期前停止接收通知,方法是在下列 URI 中呼叫 stop
方法:
https://www.googleapis.com/admin/reports_v1/channels/stop
這個方法要求您至少提供管道的 id
和 resourceId
屬性,如以下範例所示。請注意,如果 Admin SDK API 提供數種
含有 watch
方法的資源,但只有一個方法
stop
方法。
只有具備適當權限的使用者才能停止頻道。請特別注意以下幾點:
- 如果頻道是由一般使用者帳戶所建立,則只有 來自同一用戶端的 OAuth 2.0 用戶端 ID 驗證權杖) 建立管道時即可停止管道。
- 如果頻道是由服務帳戶建立,則同一個用戶端的任何使用者都可以停止頻道。
以下程式碼範例說明如何停止接收通知:
POST https://www.googleapis.com/admin/reports_v1/channels/stop Authorization: BearerCURRENT_USER_AUTH_TOKEN Content-Type: application/json { "id": "4ba78bf0-6a47-11e2-bcfd-0800200c9a66", "resourceId": "ret08u3rv24htgh289g" }