8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

验证请求来源是否来自 Firebase Function Node.JS 中的 Cloud Tasks

GoneCase123 1月前

16 0

一种简单的方法是拒绝(在代码中)所有不是来自 Cloud Tasks 的请求,适用于我的 firebase v2 function.export const createSomethingHttp = onRequest(async (request, response) => { ...

一个简单的方法来拒绝(在代码中)所有不是来自 Cloud Tasks 的针对我的 firebase v2 功能的请求。

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 帐户/服务帐户进行一些更改。我正在寻找从代码方面是否有办法。

帖子版权声明 1、本帖标题:验证请求来源是否来自 Firebase Function Node.JS 中的 Cloud Tasks
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由GoneCase123在本站《firebase》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 为了为您提供更安全的模式,以确保您的 Firebase 函数仅接受来自 Google Cloud Tasks 的请求,您可以使用 OIDC 令牌进一步增强验证。这比仅仅检查标头是否存在更安全。

    更改的代码:

    步骤 1:设置身份验证启用身份验证:确保在您的 Google Cloud 项目中启用了必要的 API。其中应该是 Cloud Tasks API。服务帐户:创建一个服务帐户,Cloud Tasks 将使用该帐户来调用 Cloud 函数。应授予此帐户 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' });
      }
    });
    
返回
作者最近主题: