Проверьте 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"}.

https://cloud.google.com/scheduler/docs/reference/rest/v1/projects.locations.jobs#appenginehttptarget

      if request.META['HTTP_X_CLOUDSCHEDULER'] == 'true':
   print("True")
Другие вопросы по тегам