繁体   English   中英

Google Cloud Platform:Cloud Functions 和 Cloud Tasks 不适用于授权的服务帐户电子邮件

[英]Google Cloud Platform: Cloud Functions and Cloud Tasks doesn't work with authorized service account email

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

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

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

我的云函数的控制台

在此处输入图片说明

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

我的 firebase 项目环境变量

在此处输入图片说明

当我将AllUsers角色添加到云函数时,它按预期工作,所以我确定我在限制访问时犯了一个错误。 我错过了什么?

更新:

我的云任务控制台

在此处输入图片说明 在此处输入图片说明

您的 OIDC 令牌似乎违反规范

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

对我audience: new URL(url).origin,task内部的oidcToken对象中删除audience: new URL(url).origin,解决了UNAUTHENTICATED(16): HTTP status code 401问题。

const task = {
    httpRequest: {
      httpMethod: 'POST',
      url,
      oidcToken: {
        serviceAccountEmail: email,
        //audience: new URL(url).origin, 
      },
      headers: {
        'Content-Type': 'application/json',
      },
      body,
    },
  };

添加audience对我有用。 这是我的任务对象的样子 -

    const task = {
      httpRequest: {
        httpMethod: 'POST',
        url,
        headers: { 'Content-Type': 'application/json' },
        oidcToken: { 
          serviceAccountEmail: sa, 
          audience: aud 
        },
      },
    };

节点文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM