cron - 验证来自 Google Cloud Scheduler 的 HTTP 请求
问题描述
验证来自 Google Cloud 调度程序的 HTTP 请求的流程是什么?文档 ( https://cloud.google.com/scheduler/docs/creating ) 提到您可以创建一个以任何公开可用的 HTTP 端点为目标的作业,但没有提到服务器如何验证 cron/scheduler 请求。
解决方案
[2019 年 5 月 28 日更新]
Google Cloud Scheduler 现在有两个命令行选项:
--oidc-service-account-email=<service_account_email>
--oidc-token-audience=<service_endpoint_being_called>
这些选项为 Cloud Scheduler 发出的请求添加了一个额外的标头:
Authorization: Bearer ID_TOKEN
您可以在端点代码中处理 ID_TOKEN 以验证谁在调用您的端点。
例如,您可以发出 HTTP 请求来解码 ID Token:
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 Scheduler 作业时,您可以对headers
和body
字段进行一些控制。您可以将自定义嵌入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\"}}"
推荐阅读
- adaboost - AdaBoost.MM 与 SAMME/SAMME.R 相比如何?
- python - 将 Keras 模型 HDF5 文件存储到 SQL 数据库
- spring-boot - Spring Boot 中的事务同步与 Database+ kafka 示例
- ios - 可本地化的字符串和默认值
- javascript - opentype.js 从画布导出字体
- javascript - 构建一个在后台运行并通过页面导航持续存在的用户会话计时器
- reactjs - 过滤多个字段反应
- kotlin - 使用服务器端事件的 JAX-RS 客户端在未完成的情况下打印相同的项目
- c++ - 如何改进 C++ 中以下代码的 UML 建模?
- python - 按下按钮 tkinter Python 后打开一个新窗口