首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Google/Firebase云功能的速率限制?

Google/Firebase云功能的速率限制?
EN

Stack Overflow用户
提问于 2018-06-07 13:01:45
回答 2查看 8.4K关注 0票数 15

我正在使用Firebase开发一个应用程序,它在内部使用云函数作为REST。我的问题是,是否有一种简单的方法来实现每个IP/每个用户的速率--限制类似于松弛使用,除了在每IP每个用户的基础上,而不是每个应用程序(因为它都是一个应用程序)。对于小爆炸的可选支持也是可取的。

示例代码(请参阅// TODO:注释):

代码语言:javascript
复制
exports.myCoolFunction = functions.https.onRequest((req, res) => {
        // TODO: implement IP rate-limiting here
        unpackToken(req).then((token) => { // unpackToken resolves with a response similar to verifyIdToken based on the "Authorization" header contents
                // TODO: implement user-based rate-limiting here (based on token.uid)
                if (!req.body) return res.status(400).end();
                if (typeof req.body.name !== "string") return res.status(400).end();
                if (typeof req.body.user !== "string") return res.status(400).end();

                // more input sanitization and function logic here

                return res.status(501).end(); // fallback in all requests, do not remove
        }).catch(() => res.status(403).end());
});

如果超出了费率限制,我想简单地使用529 Too Many Requests状态代码终止请求。这是为了防止应用程序错误淹没网络和防止REST被滥用。

这应该考虑到Firebase向上/向下旋转服务器实例,并且多个实例同时运行。 我也在使用Firestore数据库,如果需要的话可以使用遗留的实时数据库。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-07 13:38:33

在每个用户的基础上这样做听起来相当简单:

  1. 在每个请求中将用户的ID令牌传递给Cloud函数。
  2. 解码云函数中的ID令牌以确定UID。有关这两个步骤的示例,请参见存储库
  3. 将用户UID调用函数的事实推到数据库中,可能会将其添加到列表中。例如admin.database().ref(`/userCalls/$uid`).push(ServerValue.TIMESTAMP)
  4. 查询最近使用类似admin.database().ref(`/userCalls/$uid`).orderByKey().startAt(Date.now()-60000)的调用的次数。
  5. 计算结果,如果结果太高,则拒绝。

我不确定调用者的IP地址是否被传递给云函数。如果是的话,您可以对IP地址执行相同的逻辑。如果没有通过,就很难以一种不易被欺骗的方式对限制进行评级。

票数 11
EN

Stack Overflow用户

发布于 2019-07-29 09:06:23

我创建了一个库,用于对firebase函数的速率限制调用:https://www.npmjs.com/package/firebase-functions-rate-limiter库使用realtimeDB或作为后端的防火墙(可配置)。它以Frank描述的类似方式存储数据,但更经济。它不使用集合,而是使用单个文档,每个限定符都有数组(例如。用户身份)。这意味着只有一个已超出的调用只有一个读,对于一个允许的调用只有一个读-写。

代码语言:javascript
复制
$ npm i --save firebase-functions-rate-limiter

下面是一个示例:

代码语言:javascript
复制
import * as admin from "firebase-admin";
import * as functions from "firebase-functions";
import { FirebaseFunctionsRateLimiter } from "firebase-functions-rate-limiter";

admin.initializeApp(functions.config().firebase);
const database = admin.database();

const limiter = FirebaseFunctionsRateLimiter.withRealtimeDbBackend(
    {
        name: "rate_limiter_collection",
        maxCalls: 2,
        periodSeconds: 15,
    },
    database,
);
exports.testRateLimiter = 
  functions.https.onRequest(async (req, res) => {
    await limiter.rejectOnQuotaExceeded(); // will throw HttpsException with proper warning

    res.send("Function called");
});
票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50741936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档