验证请求来源是否来自 Firebase 函数 Node.JS 中的云任务

问题描述 投票:0回答:1

有一种简单的方法可以拒绝(在代码中)所有不是来自我的 firebase v2 函数的 Cloud Tasks 的请求。

export const createSomethingHttp = onRequest(async (request, response) => { // Check if the request is from Cloud Tasks if (!request.headers['x-cloudtasks-queuename']) { logger.error('Request not from Cloud Tasks', request.headers); response.status(403).json({ error: 'Forbidden' }); return; }

目前,这是我的守卫,但如果可以轻松绕过。

有没有办法修改此代码来验证请求的来源? 功能和云任务位于同一项目和同一位置。

非常感谢

我在网上找到了一些关于OIDC代币的答案,但我无法正确理解它,我认为是因为缺乏经验和专业知识,尤其是不同编码语言的答案。我认为这还需要对 GCP 帐户/服务帐户进行一些更改。我正在寻找是否有来自代码端的方法。

firebase google-cloud-platform google-cloud-functions google-cloud-tasks
1个回答
0
投票

为了给您提供更安全的模式来确保您的 Firebase 函数仅接受来自 Google Cloud 任务的请求,您可以使用 OIDC 令牌进一步增强验证。这比仅仅检查标头是否存在更安全。

更改代码:

第 1 步:设置身份验证 启用身份验证:确保在您的 Google Cloud 项目中启用必要的 API。其中应该包括 Cloud Tasks API。 服务帐户:创建云任务将用来调用云功能的服务帐户。应授予其 Cloud Functions Invoker 角色。

第 2 步:更新您的 Firebase 函数 您应该使用 google-auth-library 并在 Firebase 函数中验证 OIDC 令牌。如何做到这一点如下所示。

const { onRequest } = require('firebase-functions/v2');
const { auth } = require('google-auth-library');

const client = new auth.GoogleAuth({
  scopes: 'https://www.googleapis.com/auth/cloud-platform',
});

export const createSomethingHttp = onRequest(async (request, response) => {
  const token = request.headers['authorization']?.split('Bearer ')[1];

  if (!token) {
    response.status(403).json({ error: 'Forbidden: No token provided' });
    return;
  }

  try {
    // Verify the token
    const ticket = await client.verifyIdToken({
      idToken: token,
      audience: '<YOUR_CLOUD_FUNCTION_URL>', // Specify your Cloud Function URL
    });

    // You can also check the issuer
    const payload = ticket.getPayload();
    if (payload.aud !== '<YOUR_CLOUD_FUNCTION_URL>') {
      response.status(403).json({ error: 'Forbidden: Invalid token' });
      return;
    }

    // Proceed with your function logic
    response.status(200).json({ message: 'Request from Cloud Tasks accepted' });

  } catch (error) {
    console.error('Error verifying token:', error);
    response.status(403).json({ error: 'Forbidden: Invalid token' });
  }
});
© www.soinside.com 2019 - 2024. All rights reserved.