如何在Firebase HTTP函数中解析和验证云任务令牌



我有一个node.js应用程序,它可以创建带有身份验证的云HTTP任务。我想通过Firebase HTTP函数(也在JS中(来处理这些任务。我知道在创建任务时需要使用oidcToken,但我不知道如何在Firebase HTTP函数端验证这样的令牌。文档帮助不大。我本想在@google-cloud/tasksgoogleapis/google-auth-library-nodejs中找到一些实用程序,但什么都没想到

您所要做的就是将您的云功能与服务帐户相关联。这被称为函数标识。请注意,无论何时在GCP或Firebase中部署云功能,两个平台都会出现相同的功能。

您可以为此目的创建一个新的服务帐户:

gcloud iam service-accounts create [YOUR_NEW_SERVICE_ACCOUNT_NAME] 
--display-name "Service Account Test"

并将所需IAM角色分配给:

gcloud projects add-iam-policy-binding ${PROJECT_ID} 
--member serviceAccount:[YOUR_NEW_SERVICE_ACCOUNT_NAME]@${PROJECT_ID}.iam.gserviceaccount.com 
--role roles/cloudfunctions.invoker

你的功能部署应该像这样:

gcloud functions deploy hello_world 
--trigger-http 
--region us-central1 
--runtime nodejs14 
--service-account [YOUR_NEW_SERVICE_ACCOUNT_NAME]@${PROJECT_ID}.iam.gserviceaccount.com 
--no-allow-unauthenticated

一旦你拥有了所有这些,你的云HTTP任务应该使用这个服务帐户作为OICD令牌,但我相信你已经知道如何做到这一点。

您可以在本指南中找到更多信息(尽管它使用云调度器而不是云任务,但想法基本相同(。

您不需要验证函数中的令牌,当您创建函数时,只有经过身份验证的用户才能调用它,此验证将自动在谷歌方面完成。

所以,要做出你想要的东西,你需要:

1.创建任务队列

本操作指南中的详细步骤。

2.创建服务帐户

您需要创建具有以下IAM权限的SA:

  • 云函数调用程序
  • 云任务排队器
  • 服务帐户用户

";云函数调用程序";是能够调用该函数所必需的;Cloud Tasks Enqueuer";以将任务添加到队列中。如果您想为每个步骤使用不同的SA,您可以将这些权限分开。

3.创建Firebase函数

创建函数时,请确保它需要身份验证。

4.使用SA创建任务

文档中有一个关于这方面的部分,您可以在这里找到。以下代码复制如下:

// Imports the Google Cloud Tasks library.
const {CloudTasksClient} = require('@google-cloud/tasks');
// Instantiates a client.
const client = new CloudTasksClient();
async function createHttpTaskWithToken() {
const project = '[PROJECT_NAME]';
const queue = '[QUEUE_NAME]';
const location = '[LOCATION]';
const url = '[FUNCTION_TREIGGER_URL]';
const serviceAccountEmail = '[SA]';
const payload = 'Hello, World!';
// Construct the fully qualified queue name.
const parent = client.queuePath(project, location, queue);
const task = {
httpRequest: {
httpMethod: 'POST',
url,
oidcToken: {
serviceAccountEmail,
},
},
};
if (payload) {
task.httpRequest.body = Buffer.from(payload).toString('base64');
}
console.log('Sending task:');
console.log(task);
// Send create task request.
const request = {parent: parent, task: task};
const [response] = await client.createTask(request);
const name = response.name;
console.log(`Created task ${name}`);
}
createHttpTaskWithToken();

最新更新