验证来自Google Cloud Scheduler的HTTP请求

jrm*_*erz 5 cron scheduler google-cloud-platform google-cloud-scheduler

验证来自Google Cloud Scheduler的HTTP请求的过程是什么?docs(https://cloud.google.com/scheduler/docs/creating)提到您可以创建一个目标为任何公共HTTP终结点的作业,但没有提及服务器如何验证cron / scheduler请求。

Joh*_*ley 9

[2019 年 5 月 28 日更新]

Google Cloud Scheduler 现在有两个命令行选项:

--oidc-service-account-email=<service_account_email>
--oidc-token-audience=<service_endpoint_being_called>
Run Code Online (Sandbox Code Playgroud)

这些选项向 Cloud Scheduler 发出的请求添加了一个额外的标头:

 Authorization: Bearer ID_TOKEN
Run Code Online (Sandbox Code Playgroud)

您可以处理端点代码中的 ID_TOKEN 以验证谁在呼叫您的端点。

例如,您可以发出 HTTP 请求来解码 ID Token:

https://oauth2.googleapis.com/tokeninfo?id_token=ID_TOKEN
Run Code Online (Sandbox Code Playgroud)

这将返回这样的 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"
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以检查服务帐户电子邮件是否与您授权 Cloud Scheduler 使用的电子邮件相符,以及令牌是否未过期。

【结束更新】

您需要自己验证请求。

Google Cloud Scheduler 包含多个 Google 特定的标头,例如User-Agent: Google-Cloud-Scheduler. 请参阅下面的文档链接。

但是,任何人都可以伪造 HTTP 标头。您需要创建一个自定义something,将其包含为 HTTP 标头或包含在您知道如何验证的 HTTP 正文中。使用签名的 JWT 将是安全且易于创建和验证的。

创建 Google Cloud Scheduler 作业时,您可以对headersbody字段进行一些控制。您可以将您的自定义嵌入something其中之一。

调度器作业

[更新]

这是一个使用 gcloud 的示例(Windows 命令行),以便您可以设置 HTTP 标头和正文。此示例在每个触发器上调用 Cloud Functions,显示如何包含 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\"}}"
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!请注意,目前 Google Cloud Platform 控制台 UI 仅允许您设置自定义 POST/PUT 正文。UI 中不提供设置自定义 HTTP 标头的功能。 (2认同)