[Обновление от 28 мая 2019 г.]
Планировщик Google Cloud теперь имеет две опции командной строки:
--oidc-service-account-email=<service_account_email>
--oidc-token-audience=<service_endpoint_being_called>
Эти опции добавляют дополнительный заголовок к запросу, который делает Cloud Scheduler:
Authorization: Bearer ID_TOKEN
Вы можете обработать ID_TOKEN внутри кода конечной точки, чтобы проверить, кто вызывает вашу конечную точку.
Например, вы можете сделать HTTP-запрос для декодирования идентификатора токена:
https://oauth2.googleapis.com/tokeninfo?id_token=ID_TOKEN
Это вернет JSON так:
{
"aud": "https://cloudtask-abcdefabcdef-uc.a.run.app",
"azp": "0123456789077420983142",
"email": "cloudtask@development.iam.gserviceaccount.com",
"email_verified": "true",
"exp": "1559029789",
"iat": "1559026189",
"iss": "https://accounts.google.com",
"sub": "012345678901234567892",
"alg": "RS256",
"kid": "0123456789012345678901234567890123456789c3",
"typ": "JWT"
}
Затем вы можете проверить, совпадает ли адрес электронной почты учетной записи службы с тем, который вы разрешили использовать Cloud Scheduler, и что токен не истек.
[Конец обновления]
Вам нужно будет подтвердить запрос самостоятельно.
Google Cloud Scheduler включает несколько специфических для Google заголовков, таких как User-Agent: Google-Cloud-Scheduler
. См. Ссылку на документацию ниже.
Однако любой может подделать заголовки HTTP. Вам нужно создать пользовательский something
, который вы включите в качестве заголовка HTTP или в тексте HTTP, который вы знаете, как проверить. Использование подписанного JWT будет безопасным и простым в создании и проверке.
Когда вы создаете задание планировщика Google Cloud, вы можете управлять полями headers
и body
. Вы можете встроить свой пользовательский something
в любой из них.
Планировщик заданий
[Update]
Вот пример (командная строка 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\"}}"