有一个 Google App Engine 应用程序可以处理对象变更通知。
如何正确地保护它,以便它只能接收通知而不会暴露给其他任何人?
答案1
建立系统将真实通知与受监视资源区分开并丢弃其他不需要的 POST 消息的一种方法是使用令牌来设置通知渠道。通知消息中的标头应返回相同的令牌。然后只需检查标头是否存在该令牌即可。简而言之,真正的通知消息将在特定标头中包含建议的令牌,因此您只需检查该标头即可确认通知是真实的。
例如,要使用名为“ClientToken”的令牌设置此功能,您可以运行 gsutil 通知命令:
gsutil notification watchbucket [-i ChannelId] [-t ClientToken] ApplicationUrl gs://BucketName
上述命令生成的结果请求可能类似于:
POST /storage/v1/b/BucketName/o/watch?alt=json HTTP/1.1
Host: www.googleapis.com
Content-Length: 200
User-Agent: google-api-python-client/1.0
Content-Type: application/json
Authorization: Bearer OAuthToken
{
"token": "ClientToken",
"type": "web_hook",
"id": "ChannelId",
"address": "ApplicationUrl"
}
上述命令会创建一个新的通知通道,可用于在监视的对象发生变化时发送通知。此类消息的示例可能如下所示:
POST /ApplicationUrlPath
Accept: */*
Content-Type: application/json; charset="utf-8"
Content_Length: 0
Host: ApplicationUrlHost
X-Goog-Channel-Id: ChannelId
X-Goog-Channel-Token: ClientToken
X-Goog-Resource-Id: ResourceId
X-Goog-Resource-State: sync
X-Goog-Resource-Uri: https://www.googleapis.com/storage/v1/b/BucketName/o?alt=json
该消息的结构允许您在标头 X-Goog-Channel-Token 的帮助下轻松识别所包含的客户端令牌:
X-Goog-Channel-Token: ClientToken