Firebase CronJobs - 如何允许来自一个 cronjob 站点的 http 触发器

Firebase CronJobs - how to allow http triggers from one cronjob site

由于 Firebase(实时数据库)不支持 cron-jobs 我正在使用 cron-job.org 来安排 http 触发器。这个函数应该在每天结束时触发一次,所以在 11:55pm 左右。问题是我只希望 cron-job.org 能够触发 http 端点而不是其他任何人(例如,有人恶意尝试每天多次触发它)。我怎样才能在我的云功能中实现这一点?

我已经设置了 cronjob,这是我现在拥有的所有代码:

exports.findAndDeleteSevenDayJobs = functions.https.onRequest((req, res) => {
  console.log('req',req);
});

另外,cron-job.org 提供了这个:

而且我不知道如何使用它。

要在 firebase RDB 中创建 cron-jobs,请使用像 cron-job.org

这样的第三方服务

1) 创建密钥

为了确保一切安全,您必须生成一个安全密钥,从现在开始称为 YourSelfGeneratedButSecureKey

您可以在终端中输入以下内容生成一个:node -e "console.log(require('crypto').randomBytes(20).toString('hex'))"

2) 创建 CRON 作业

创建一个新的 cron-job,它将命中您的云函数端点并将创建的密钥作为 url-query 附加,如下所示:

https://{projectSpecific}.cloudfunctions.net/{nameOfFunction}?key={YourSelfGeneratedButSecureKey}

在您的终端中使用以下命令将密钥设置到您的环境中: firebase functions:config:set cron.key="{YourSelfGeneratedButSecureKey}"

3) 云函数

为了确保一切都是最高安全性,您可以通过键入 npm install --save secure-compare;

安装 secure-compare

然后在你的云函数中:

const secureCompare = require('secure-compare');

exports.{nameOfFunction} = functions.https.onRequest((req, res) => {

  const { key } = req.query;

  if (!secureCompare(key, functions.config().cron.key)) {
    console.log('Key in request and in env do NOT match');
    res.status(403).send('Security key does not match.');
    return null;
  }
  
  // DO REPETITIVE STUFF SECURELY 

});