推播通知

本文說明如何使用推播通知,在資源變更時通知應用程式。

總覽

Admin SDK API 提供推播通知,讓您能夠監控資源的變化。您可以使用這項功能提升應用程式效能。如此一來,您就能省去輪詢資源衍生的額外網路和運算費用,判斷資源是否有所變動。 每當監控的資源變更時,Admin SDK API 都會通知您的應用程式。

如要使用推播通知,您必須執行下列兩項操作:

  • 設定接收網址或「Webhook」回呼接收器。

    這個 HTTPS 伺服器會處理資源變更時觸發的 API 通知訊息。

  • 請為您要監控的每個資源端點設定通知管道。

    管道可指定通知訊息的轉送資訊。在設定管道時,您必須指定要接收通知的特定網址。每當管道的資源變更,Admin SDK API 都會以 POST 要求的形式傳送通知訊息給該網址。

目前,Admin SDK API 支援 Activities 資源變更通知。

建立通知管道

如要要求推播通知,您必須為要監控的每項資源設定通知管道。通知管道設定完成後,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: 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.
  "payload": true, // (Optional) Whether to include the payload (message body) in notifications.
  "expiration": 3600 // (Optional) Your requested channel expiration time.
}

您可以使用 userKeyapplicationNameeventNamefilters 參數,只接收特定事件、使用者或應用程式的通知。

注意:為求明確,以下範例省略要求主體。

查看所有管理員活動:

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 標頭中。

  • 設為 web_hook 值的 type 屬性字串。

  • 這個 address 屬性字串是設為網址,可以監聽並回應這個通知管道的通知。這是您的 Webhook 回呼網址,必須使用 HTTPS。

    請注意,您的網路伺服器必須安裝有效的 SSL 憑證,Admin SDK API 才能傳送通知到這個 HTTPS 位址。無效的憑證包括:

    • 自行簽署的憑證。
    • 由不受信任的來源所簽署的憑證。
    • 已撤銷的憑證。
    • 主體與目標主機名稱不符的憑證。

選用屬性

您也可以使用 watch 要求指定這些選填欄位:

  • token 屬性,會指定做為管道權杖使用的任意字串值。您可以將通知管道權杖用於多種用途。例如,您可以使用此權杖來驗證每則傳入的訊息屬於應用程式建立的管道 (確保通知並非假冒),或依據此管道的用途,將訊息轉送至應用程式中的正確的目的地。長度上限:256 個半形字元。

    應用程式從這個管道收到的每則通知訊息中,憑證都會包含在 X-Goog-Channel-Token HTTP 標頭中。

    如果您使用通知管道權杖,建議您:

    • 請使用可擴充的編碼格式,例如網址查詢參數。範例:forwardTo=hr&createdBy=mobile

    • 請勿加入 OAuth 權杖等機密資料。

  • expiration 屬性字串,設為您希望 Admin SDK API 停止傳送這個通知管道訊息的日期和時間 Unix 時間戳記 (以毫秒為單位)。

    如果管道設有到期時間,系統會在應用程式收到此管道的每則通知訊息中,以使用者可理解的格式加入 X-Goog-Channel-Expiration HTTP 標頭值 (使用者可理解的格式)。

如要進一步瞭解要求,請參閱 API 參考資料中 Activities 資源的 watch 方法。

觀看回覆

如果 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.
}

除了您在要求中傳送的屬性外,傳回的資訊也包含 resourceIdresourceUri,以便識別這個通知管道正在查看的資源。

您可以將傳回的資訊傳送至其他通知管道作業,例如想要停止接收通知的時間。

如要進一步瞭解回應,請參閱 API 參考資料中活動資源的 watch 方法。

同步處理訊息

建立用來監控資源的通知管道後,Admin SDK API 會傳送 sync 訊息,指出通知正在啟動。這些訊息的 X-Goog-Resource-State HTTP 標頭值是 sync。由於網路時間問題,即使您收到 watch 方法回應,也可能收到 sync 訊息。

您可以放心忽略 sync 通知,但也可以使用此通知。舉例來說,如果您決定不保留管道,可以在呼叫中使用 X-Goog-Channel-IDX-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 標頭:

標題 說明
一律顯示
X-Goog-Channel-ID UUID 或其他專為識別此通知管道而提供的不重複字串。
X-Goog-Message-Number 識別此通知管道訊息的整數。若為 sync 訊息,值一律為 1。頻道中後續每一則訊息的訊息數量會增加,但系統不會依序顯示。
X-Goog-Resource-ID 可識別已觀察資源的不透明值。這個 ID 在各個 API 版本中都能保持不變。
X-Goog-Resource-State 觸發通知的新資源狀態。可能的值:sync事件名稱
X-Goog-Resource-URI 受監控資源的 API 版本專屬 ID。
有時會展示
X-Goog-Channel-Expiration 通知管道的到期時間,以使用者可理解的格式表示。只有在已定義時才會顯示。
X-Goog-Channel-Token 由應用程式設定的通知管道權杖,可用於驗證通知來源。只有在已定義時才會顯示。

活動的通知訊息會在要求主體中提供下列資訊:

屬性 說明
kind 將此視為活動資源。值:固定字串「admin#reports#activity」。
id 活動記錄的專屬 ID。
id.time 活動的發生時間。這個值採用 ISO 8601 日期和時間格式。時間則是完整日期加上時、分、秒,格式為 YYYY-MM-DDThh: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 支援 IPv4IPv6
events[] 報表中的活動事件。
events[].type 事件類型。管理員變更的 Google Workspace 服務或功能會顯示在 type 資源中,以便使用 eventName 資源識別事件。
events[].name 事件的名稱。這是 API 回報的活動專屬名稱。每個 eventName 都與 API 區分為各種事件類型的特定 Google Workspace 服務或功能相關。
一般 eventName 要求參數:
  • 如未提供 eventName,報表會傳回 eventName 的所有可能例項。
  • 當您要求 eventName 時,API 的回應會傳回包含該 eventName 的所有活動。傳回的活動除了所要求的活動之外,可能還會有其他 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"
        }
      ]
    }
  ]
}

根據通知內容採取行動

如要表示成功,您可以傳回下列任一狀態碼:200201202204102

如果您的服務使用 Google API 用戶端程式庫,並傳回 500502503504,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

這個方法需要您至少提供頻道的 idresourceId 屬性,如以下範例所示。請注意,如果 Admin SDK API 有數種包含 watch 方法的資源類型,那麼只有一個 stop 方法。

只有具備適當權限的使用者才能停止頻道。請特別注意以下幾點:

  • 如果管道是由一般使用者帳戶建立,則只有建立管道的相同用戶端 (由建立管道的 OAuth 2.0 用戶端 ID 來識別) 的相同使用者才能停止管道。
  • 如果管道是由服務帳戶建立,則來自相同用戶端的任何使用者都可以停止管道。

下列程式碼範例說明如何停止接收通知:

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

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