Существует приложение Google App Engine, которое обрабатывает Уведомления об изменении объекта.
Как правильно защитить его, чтобы он мог получать только уведомления и не подвергался воздействию чего-либо еще?
Одним из способов создания системы отделения подлинных уведомлений от наблюдаемого ресурса и отбрасывания других нежелательных сообщений 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