Назад | Перейти на главную страницу

Разрешить только уведомление об изменении объекта в приложении App Engine

Существует приложение 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