Cloud Functions / Cloud Tasks UNAUTHENTICATED 错误
Cloud Functions / Cloud Tasks UNAUTHENTICATED error
我正在尝试获取 Cloud Functions 来创建将调用 Cloud Functions 的 Cloud Task。简单。
流程和用例非常接近to the official tutorial here。
我还查看了 at this article by Doug Stevenson,尤其是它的安全部分。
运气不好,我在 Cloud Task 中一直遇到 16 (UNAUTHENTICATED)
错误。
如果我可以相信我在控制台中看到的内容,那么 Cloud Task 似乎没有将 OIDC 令牌附加到请求:
然而,在我的代码中我确实有 oidcToken
对象:
const { v2beta3, protos } = require("@google-cloud/tasks");
import {
PROJECT_ID,
EMAIL_QUEUE,
LOCATION,
EMAIL_SERVICE_ACCOUNT,
EMAIL_HANDLER,
} from "./../config/cloudFunctions";
export const createHttpTaskWithToken = async function (
payload: {
to_email: string;
templateId: string;
uid: string;
dynamicData?: Record<string, any>;
},
{
project = PROJECT_ID,
queue = EMAIL_QUEUE,
location = LOCATION,
url = EMAIL_HANDLER,
email = EMAIL_SERVICE_ACCOUNT,
} = {}
) {
const client = new v2beta3.CloudTasksClient();
const parent = client.queuePath(project, location, queue);
// Convert message to buffer.
const convertedPayload = JSON.stringify(payload);
const body = Buffer.from(convertedPayload).toString("base64");
const task = {
httpRequest: {
httpMethod: protos.google.cloud.tasks.v2.HttpMethod.POST,
url,
oidcToken: {
serviceAccountEmail: email,
audience: new URL(url).origin,
},
headers: {
"Content-Type": "application/json",
},
body,
},
};
try {
// Send create task request.
const request = { parent: parent, task: task };
const [response] = await client.createTask(request);
console.log(`Created task ${response.name}`);
return response.name;
} catch (error) {
if (error instanceof Error) console.error(Error(error.message));
return;
}
};
当在 Cloud Logging 中记录上述代码中的 task 对象时,我可以看到服务帐户是我为此目的创建的帐户,以及 Cloud Tasks已成功创建。
我是:
以及Cloud Task需要调用的函数:
理论上一切似乎都存在。
关于我会遗漏什么的任何建议?
谢谢,
您的听众不正确。它必须以函数名结尾。在这里,您只有区域和项目 https://<region>-<projectID>.cloudfunction.net/
。使用完整的云功能 URL.
我正在尝试获取 Cloud Functions 来创建将调用 Cloud Functions 的 Cloud Task。简单。
流程和用例非常接近to the official tutorial here。
我还查看了 at this article by Doug Stevenson,尤其是它的安全部分。
运气不好,我在 Cloud Task 中一直遇到 16 (UNAUTHENTICATED)
错误。
如果我可以相信我在控制台中看到的内容,那么 Cloud Task 似乎没有将 OIDC 令牌附加到请求:
然而,在我的代码中我确实有 oidcToken
对象:
const { v2beta3, protos } = require("@google-cloud/tasks");
import {
PROJECT_ID,
EMAIL_QUEUE,
LOCATION,
EMAIL_SERVICE_ACCOUNT,
EMAIL_HANDLER,
} from "./../config/cloudFunctions";
export const createHttpTaskWithToken = async function (
payload: {
to_email: string;
templateId: string;
uid: string;
dynamicData?: Record<string, any>;
},
{
project = PROJECT_ID,
queue = EMAIL_QUEUE,
location = LOCATION,
url = EMAIL_HANDLER,
email = EMAIL_SERVICE_ACCOUNT,
} = {}
) {
const client = new v2beta3.CloudTasksClient();
const parent = client.queuePath(project, location, queue);
// Convert message to buffer.
const convertedPayload = JSON.stringify(payload);
const body = Buffer.from(convertedPayload).toString("base64");
const task = {
httpRequest: {
httpMethod: protos.google.cloud.tasks.v2.HttpMethod.POST,
url,
oidcToken: {
serviceAccountEmail: email,
audience: new URL(url).origin,
},
headers: {
"Content-Type": "application/json",
},
body,
},
};
try {
// Send create task request.
const request = { parent: parent, task: task };
const [response] = await client.createTask(request);
console.log(`Created task ${response.name}`);
return response.name;
} catch (error) {
if (error instanceof Error) console.error(Error(error.message));
return;
}
};
当在 Cloud Logging 中记录上述代码中的 task 对象时,我可以看到服务帐户是我为此目的创建的帐户,以及 Cloud Tasks已成功创建。
我是:
以及Cloud Task需要调用的函数:
理论上一切似乎都存在。
关于我会遗漏什么的任何建议?
谢谢,
您的听众不正确。它必须以函数名结尾。在这里,您只有区域和项目 https://<region>-<projectID>.cloudfunction.net/
。使用完整的云功能 URL.