本文档介绍了如何使用推送通知来 在资源发生更改时应用
概览
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
如需为有关特定资源更改的消息设置通知渠道,请向相应资源的 watch
方法发送 POST
请求。
每个通知渠道都与特定用户和特定资源(或一组资源)相关联。watch
请求
除非当前用户
或服务账号
拥有此资源或有权访问此资源。
示例
针对 Activities 资源的所有监控请求都采用以下通用格式:
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
属性字符串 新通知渠道。我们建议使用 通用唯一标识符 (UUID) 或类似名称 唯一字符串。长度上限:64 个字符。您设置的 ID 值会回显到 每个通知的
X-Goog-Channel-Id
HTTP 标头 消息。 -
一个
type
属性字符串,设置为该值web_hook
。 -
address
属性字符串,设置为监听的网址 并响应此通知渠道的通知。这是 网络钩子回调网址,并且必须使用 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. }
除了您在请求中发送的属性之外,返回的信息还包含 resourceId
和 resourceUri
,用于标识在此通知渠道上正在监控的资源。
您可以将返回的信息传递给其他通知渠道 操作,例如当您要停止接收 通知。
同步信息
创建用于监控资源的通知渠道后,
Admin SDK API 会发送 sync
消息来指明:
通知正在启动。这些消息的 X-Goog-Resource-State
HTTP 标头值为 sync
。原因:网络
时间问题,可能会收到 sync
消息
您甚至无需收到 watch
方法响应。
您可以放心地忽略 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 标头:
标题 | 说明 |
---|---|
始终存在 | |
|
您提供的用于标识此 ID 的 UUID 或其他唯一字符串 通知渠道。 |
|
用于标识此通知的消息的整数
。对于 sync 消息,值始终为 1 。渠道中的每条后续消息都会使消息编号递增,但这些编号并非顺序编号。 |
|
用于标识所监控资源的不透明值。此 ID 在各个 API 版本中保持稳定。 |
|
触发通知的新资源状态。
可能的值:
sync 或事件名称。
|
|
所监控资源的 API 版本特定标识符。 |
有时会出现 | |
|
通知渠道到期的日期和时间,以 简单易懂的格式仅在定义的情况下才会存在。 |
|
由您的应用设置的通知渠道令牌,可用于验证通知来源。仅在定义的情况下才存在。 |
Activity 的通知消息在请求正文中包含以下信息:
属性 | 说明 |
---|---|
kind |
将其标识为 activity 资源。值:固定字符串“admin#reports#activity ”。 |
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 账号的唯一标识符。 |
actor |
执行操作的用户。 |
actor.callerType |
执行报告中列出的活动的作者类型。在此版本的 API 中,callerType 是执行了报告中列出的操作的 USER 或 OAuth 2LO 实体请求。 |
actor.email |
要报告其活动的用户的主电子邮件地址。 |
actor.profileId |
用户的唯一 Google Workspace 个人资料 ID。 |
ownerDomain |
管理控制台或文档应用文档所有者的网域。这是指受报告事件影响的网域。 |
ipAddress |
执行操作的用户的 IP 地址。这是用户登录 Google Workspace 时使用的互联网协议 (IP) 地址,不一定能反映用户的实际位置。例如,IP 地址可以是用户的代理服务器地址,也可以是虚拟专用网 (VPN) 地址。该 API 支持 IPv4 和 IPv6。 |
events[] |
报告中的活动事件。 |
events[].type |
事件类型。type 属性用于标识管理员更改的 Google Workspace 服务或功能,此属性使用 eventName 属性标识事件。 |
events[].name |
活动名称。这是 API 报告的活动的具体名称。每个 eventName 都与特定的 Google Workspace 服务或功能相关,该 API 会将这些服务或功能整理为事件类型。
对于 eventName 请求参数,一般而言:
|
events[].parameters[] |
各种应用的参数值对。 |
events[].parameters[].name |
参数的名称。 |
events[].parameters[].value |
参数的字符串值。 |
events[].parameters[].intValue |
参数的整数值。 |
events[].parameters[].boolValue |
参数的布尔值。 |
示例
Activity 资源事件的通知消息采用一般形式:
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" }