Проверьте HTTP-запрос от Google Cloud Scheduler
Как происходит проверка HTTP-запроса из планировщика Google Cloud? В документах ( https://cloud.google.com/scheduler/docs/creating) упоминается, что вы можете создать задание с целью любой общедоступной конечной точки HTTP, но не упоминается, как сервер проверяет запрос cron / планировщика.
4 ответа
Вам нужно будет подтвердить запрос самостоятельно.
Google Cloud Scheduler включает в себя несколько специальных заголовков Google, таких как User-Agent: Google-Cloud-Scheduler
, Обратитесь к ссылке на документацию ниже.
Однако любой может подделать заголовки HTTP. Вам нужно создать кастом something
что вы включаете в качестве заголовка HTTP или в тексте HTTP, который вы знаете, как проверить. Использование подписанного JWT будет безопасным и простым в создании и проверке.
Когда вы создаете Google Cloud Scheduler Job, у вас есть некоторый контроль над headers
а также body
поля. Вы можете встроить свой обычай something
в любом.
[Обновить]
Вот пример (командная строка Windows), использующий gcloud, чтобы вы могли установить заголовки HTTP и тело. В этом примере вызывается функция Cloud для каждого триггера, показывающая, как включить APIKEY. Консоль Google еще не имеет такого уровня поддержки.
gcloud beta scheduler ^
--project production ^
jobs create http myfunction ^
--time-zone "America/Los_Angeles" ^
--schedule="0 0 * * 0" ^
--uri="https://us-central1-production.cloudfunctions.net/myfunction" ^
--description="Job Description" ^
--headers="{ \"Authorization\": \"APIKEY=AUTHKEY\", \"Content-Type\": \"application/json\" }" ^
--http-method="POST" ^
--message-body="{\"to\":\"/topics/allDevices\",\"priority\":\"low\",\"data\":{\"success\":\"ok\"}}"
Короткий ответ
Если вы размещаете свое приложение в Google Cloud, просто проверьте заголовок X-Appengine-Queuename
равняется __scheduler
, Однако это недокументированное поведение, дополнительную информацию читайте ниже.
Кроме того, если возможно, используйте Pub/Sub вместо HTTP-запросов, так как Pub/Sub отправляется изнутри (поэтому имеет неявно проверенное происхождение).
эксперимент
Как я нашел здесь, Google удаляет запросы определенных заголовков 1, но не всех 2. Давайте выясним, есть ли такие заголовки для Cloud Scheduler.
1 Например, вы не можете отправить X-Google-*
Заголовки (найдены экспериментально, но вот некоторая информация об этом)
2 Например, вы можете отправить X-Appengine-*
заголовки (найдены экспериментально)
Колба приложение, используемое в эксперименте:
@app.route('/echo_headers')
def echo_headers():
headers = {h[0]: h[1] for h in request.headers}
print(headers)
return jsonify(headers)
Заголовки запроса отправляются Cloud Scheduler
{
"Host": []
"X-Forwarded-For": "0.1.0.2, 169.254.1.1",
"X-Forwarded-Proto": "http",
"User-Agent": "AppEngine-Google; (+http://code.google.com/appengine)",
"X-Appengine-Queuename": "__scheduler",
"X-Appengine-Taskname": [private]
"X-Appengine-Taskretrycount": "1",
"X-Appengine-Taskexecutioncount": "0",
"X-Appengine-Tasketa": [private]
"X-Appengine-Taskpreviousresponse": "0",
"X-Appengine-Taskretryreason": "",
"X-Appengine-Country": "ZZ",
"X-Cloud-Trace-Context": [private]
"X-Appengine-Https": "off",
"X-Appengine-User-Ip": [private]
"X-Appengine-Api-Ticket": [private]
"X-Appengine-Request-Log-Id": [private]
"X-Appengine-Default-Version-Hostname": [private]
}
Доказательство того заголовка X-Appengine-Queuename
раздели GAE
Ограничения
Этот метод, скорее всего, не поддерживается соглашениями об уровне обслуживания и амортизацией Google, поскольку он не задокументирован. Кроме того, я не уверен, что заголовок не может быть подделан, когда источник запроса находится в Google Cloud (возможно, они удалены на внешнем слое). Я протестировал с приложением в GAE, результаты могут отличаться или не отличаться для других вариантов развертывания. Короче используйте на свой страх и риск.
Этот заголовок должен работать:
карта (ключ: строка, значение: строка)
Заголовки HTTP-запроса.
Эта карта содержит имена и значения полей заголовка. Заголовки можно установить при создании задания.
Cloud Scheduler устанавливает для некоторых заголовков значения по умолчанию:
User-Agent: по умолчанию это заголовок «AppEngine-Google;(+http://code.google.com/appengine)». Этот заголовок можно изменить, но Cloud Scheduler добавит «AppEngine-Google;(+http://code.google.com/appengine)» к измененному User-Agent.X-CloudScheduler: для этого заголовка будет установлено значение true. X-CloudScheduler-JobName: этот заголовок будет содержать имя задания. X-CloudScheduler-ScheduleTime: для заданий Cloud Scheduler, указанных в формате unix-cron, этот заголовок будет содержать время расписания заданий в формате RFC3339 UTC «Zulu». Если у задания есть тело, Cloud Scheduler устанавливает следующие заголовки:
Content-Type: по умолчанию для заголовка Content-Type установлено значение «application / octet-stream». Значение по умолчанию можно изменить, явно установив Content-Type для определенного типа мультимедиа при создании задания. Например, Content-Type может иметь значение «application / json». Content-Length: вычисляется Cloud Scheduler. Это значение только выводится. Это не может быть изменено. Заголовки ниже выводятся только. Их нельзя установить или переопределить:
X-Google-: только для внутреннего использования Google. X-AppEngine- : только для внутреннего использования Google. Кроме того, обработчику задания также отправляются некоторые заголовки App Engine, содержащие информацию о задании.
Объект, содержащий список пар «ключ: значение». Пример: {"name": "гаечный ключ", "mass": "1,3 кг", "count": "3"}.
if request.META['HTTP_X_CLOUDSCHEDULER'] == 'true':
print("True")