Google Cloud Platform:云功能和云任务不适用于授权服务帐户电子邮件

Oot*_*oto 5 firebase google-cloud-platform google-cloud-functions google-cloud-tasks

我创建了一个服务帐户电子邮件cloudfunctions.invoker并向该电子邮件添加了角色,以便我可以确保只有云任务可以触发云功能,然后我删除了AllUsers角色。但是当云任务尝试运行云函数时,状态码为UNAUTHENTICATED(16): HTTP status code 401,执行失败。

我当前的代码和控制台是这样的。

index.ts

export const addTasks = functions.https.onCall((data, context) => {
  if (!context.auth) {
    throw new functions.https.HttpsError('failed-precondition', 'You are not authenticated.')
  }

  const client = new tasks.CloudTasksClient()

  const projectId = functions.config().project.id
  const queue = 'queue'
  const location = functions.config().project.location
  const parent = client.queuePath(projectId, location, queue)
  const url = `https://${location}-${projectId}.cloudfunctions.net/executeSomething`
  const serviceAccountEmail = functions.config().project.email

  const task: tasks.protos.google.cloud.tasks.v2.ITask = {
    httpRequest: {
      httpMethod: 'POST',
      url: url,
      oidcToken: {
        serviceAccountEmail: serviceAccountEmail,
      },
    },
    scheduleTime: {
      seconds: ...,
    },
  }

  const request: tasks.protos.google.cloud.tasks.v2.ICreateTaskRequest = {
    parent: parent,
    task: task,
  }

  return client.createTask(request)
}
Run Code Online (Sandbox Code Playgroud)

我的云函数的控制台

在此输入图像描述

我将云函数调用者角色添加到服务帐户电子邮件中。

我的firebase项目环境变量

在此输入图像描述

当我AllUsers向云功能添加角色时,它按预期工作,因此我确信我在限制访问时犯了错误。我缺少什么?

更新:

我的云任务控制台

在此输入图像描述 在此输入图像描述

gui*_*ere 0

您的 OIDC 令牌似乎违反了规范

只需提供电子邮件,而不像本示例中那样提供属性名称,或者使用如规范中所述的 Snake_case