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
            }
}

问题总结:

  1. 您有一个 public (allUsers) 云 运行 服务。
  2. 您已经创建了自己的授权机制(HS256 - HMAC with SHA-256)。
  3. 您想为 HTTP 授权承载值分配自定义令牌。
  4. 云 运行 授权由 IAP 管理。

云 运行 服务的授权由身份识别代理 (IAP) 管理。如果您添加 HTTP Authorization Bearer 令牌,IAP 将验证该令牌。该步骤对您的自定义令牌失败,导致 HTTP 403 禁止错误。

Cloud Tasks 支持两种类型的 HTTP 授权承载令牌。 OAuth 访问令牌和 OIDC 身份令牌。您不能使用自己的令牌值来替换支持的类型。

你有两个选择:

  1. 增强您的代码以支持 Google 签名的 OIDC 身份令牌。
  2. 使用支持自定义令牌格式的自定义 HTTP header。

注意:我不推荐使用HS256。 HS256 是一种对称算法,这意味着双方必须知道秘密才能验证有效载荷。 RS256 是一种使用 private/public 密钥对的非对称算法。验证只需要 public 键。这是 Google 对服务帐户和身份使用私钥的强大设计特征之一。如果您切换到 Google 的方法,所有困难的工作都会为您完成。