Cloud Tasks 屏蔽 Bearer Token(到 Public Cloud 运行)
Cloud Tasks masks Bearer Token (To a Public Cloud Run)
我有一个 public Cloud 运行,由 JWT 令牌验证。工作 100%。
Cloud 运行 解码令牌的逻辑在 python:
def decode_jwt(token: str) -> dict:
try:
decoded_token = jwt.decode(
token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
return decoded_token if decoded_token["expires"] >= time.time() else None
except Exception as e:
raise InvalidTokenError
云 运行 public只能使用自定义域。
现在,我想使用 Cloud Tasks 向 Cloud 运行 发出一些请求(每个请求都有不同的参数,之前由 Cloud Functions 创建)。
在 Cloud Tasks 中,我使用“Bearer {token}”参数创建每个任务
云任务Headers代码:
task["http_request"]["headers"] = \
{"Authorization": f"Bearer {token}",
"Accept": "application/json"}
第一种情况:
当我在 http_request 创建时创建没有“oidc_token”参数的任务。
Cloud 运行 returns “403 Forbidden”,永远不会到达 cloud 运行 中的 decode_jwt 函数。
云任务 http_request 代码:
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
}
}
第二种情况:
我添加了一个“oidc_token”。
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
}
}
现在,请求到达云运行decode_jwt函数,并登录云运行returns”无效令牌错误”。
额外:我添加了一个 logging.info 来公开 Cloud 运行 中收到的令牌,而不是我在 Cloud Task Creation 中传递的令牌。
您必须指定云 运行 服务的受众,就像那样
task = {
"http_request": { # Specify the type of request.
"http_method": tasks_v2.HttpMethod.POST,
"url": url, # The full url path that the task will be sent to.
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
"audience": base url of Cloud Run, no /sub/path
}
}
问题总结:
- 您有一个 public (allUsers) 云 运行 服务。
- 您已经创建了自己的授权机制(HS256 - HMAC with SHA-256)。
- 您想为 HTTP 授权承载值分配自定义令牌。
- 云 运行 授权由 IAP 管理。
云 运行 服务的授权由身份识别代理 (IAP) 管理。如果您添加 HTTP Authorization Bearer 令牌,IAP 将验证该令牌。该步骤对您的自定义令牌失败,导致 HTTP 403 禁止错误。
Cloud Tasks 支持两种类型的 HTTP 授权承载令牌。 OAuth 访问令牌和 OIDC 身份令牌。您不能使用自己的令牌值来替换支持的类型。
你有两个选择:
- 增强您的代码以支持 Google 签名的 OIDC 身份令牌。
- 使用支持自定义令牌格式的自定义 HTTP header。
注意:我不推荐使用HS256。 HS256 是一种对称算法,这意味着双方必须知道秘密才能验证有效载荷。 RS256 是一种使用 private/public 密钥对的非对称算法。验证只需要 public 键。这是 Google 对服务帐户和身份使用私钥的强大设计特征之一。如果您切换到 Google 的方法,所有困难的工作都会为您完成。
我有一个 public Cloud 运行,由 JWT 令牌验证。工作 100%。 Cloud 运行 解码令牌的逻辑在 python:
def decode_jwt(token: str) -> dict:
try:
decoded_token = jwt.decode(
token, JWT_SECRET, algorithms=[JWT_ALGORITHM])
return decoded_token if decoded_token["expires"] >= time.time() else None
except Exception as e:
raise InvalidTokenError
云 运行 public只能使用自定义域。
现在,我想使用 Cloud Tasks 向 Cloud 运行 发出一些请求(每个请求都有不同的参数,之前由 Cloud Functions 创建)。 在 Cloud Tasks 中,我使用“Bearer {token}”参数创建每个任务
云任务Headers代码:
task["http_request"]["headers"] = \
{"Authorization": f"Bearer {token}",
"Accept": "application/json"}
第一种情况:
当我在 http_request 创建时创建没有“oidc_token”参数的任务。 Cloud 运行 returns “403 Forbidden”,永远不会到达 cloud 运行 中的 decode_jwt 函数。 云任务 http_request 代码:
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
}
}
第二种情况: 我添加了一个“oidc_token”。
task = {
"http_request": {
"http_method": tasks_v2.HttpMethod.POST,
"url": url,
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
}
}
现在,请求到达云运行decode_jwt函数,并登录云运行returns”无效令牌错误”。 额外:我添加了一个 logging.info 来公开 Cloud 运行 中收到的令牌,而不是我在 Cloud Task Creation 中传递的令牌。
您必须指定云 运行 服务的受众,就像那样
task = {
"http_request": { # Specify the type of request.
"http_method": tasks_v2.HttpMethod.POST,
"url": url, # The full url path that the task will be sent to.
"oidc_token": {
"service_account_email": "service-task@xxxxx.iam.gserviceaccount.com",
"audience": base url of Cloud Run, no /sub/path
}
}
问题总结:
- 您有一个 public (allUsers) 云 运行 服务。
- 您已经创建了自己的授权机制(HS256 - HMAC with SHA-256)。
- 您想为 HTTP 授权承载值分配自定义令牌。
- 云 运行 授权由 IAP 管理。
云 运行 服务的授权由身份识别代理 (IAP) 管理。如果您添加 HTTP Authorization Bearer 令牌,IAP 将验证该令牌。该步骤对您的自定义令牌失败,导致 HTTP 403 禁止错误。
Cloud Tasks 支持两种类型的 HTTP 授权承载令牌。 OAuth 访问令牌和 OIDC 身份令牌。您不能使用自己的令牌值来替换支持的类型。
你有两个选择:
- 增强您的代码以支持 Google 签名的 OIDC 身份令牌。
- 使用支持自定义令牌格式的自定义 HTTP header。
注意:我不推荐使用HS256。 HS256 是一种对称算法,这意味着双方必须知道秘密才能验证有效载荷。 RS256 是一种使用 private/public 密钥对的非对称算法。验证只需要 public 键。这是 Google 对服务帐户和身份使用私钥的强大设计特征之一。如果您切换到 Google 的方法,所有困难的工作都会为您完成。