Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

193
Views
¿Limitación de velocidad para las funciones en la nube de Google/Firebase?

Estoy usando Firebase para desarrollar una aplicación que usa Cloud Functions como API REST internamente. Mi pregunta es, ¿existe una manera fácil de implementar una limitación de velocidad por IP/por usuario similar a la que usa Slack , excepto por IP y por usuario , en lugar de por aplicación (ya que es una sola aplicación ). También es preferible el soporte opcional para pequeñas ráfagas.

Código de ejemplo (ver // TODO: comentarios):

 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()); });

Quiero terminar la solicitud simplemente con un código de estado 529 Too Many Requests si se excede el límite de tasa. Esto es para evitar que los errores de la aplicación inunden la red y para evitar el abuso de la API REST.

Esto debería tener en cuenta que Firebase activa o desactiva las instancias del servidor y que varias instancias se ejecutan simultáneamente.

También estoy usando una base de datos de Firestore y puedo usar la base de datos heredada en tiempo real si es necesario.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Creé una biblioteca para llamadas de limitación de velocidad a las funciones de firebase: firebase-functions-rate-limiter La biblioteca usa realtimeDB o firestore (configurable) como backend. Almacena datos, con un enfoque similar al que describió Frank, pero es más económico. En lugar de usar una colección, usa un solo documento con una matriz por cada calificador (por ejemplo, una identificación de usuario). Eso significa que solo hay una sola lectura para una llamada excedida y una lectura y escritura para una llamada permitida.

 $ npm i --save firebase-functions-rate-limiter

Aquí hay un ejemplo:

 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"); });
over 4 years ago · Santiago Trujillo Report

0

Hacer esto por usuario suena bastante sencillo:

  1. Pase el token de ID del usuario a Cloud Functions con cada solicitud.
  2. Descodifique el token de ID en su Cloud Function para determinar el UID. Para ver un ejemplo de estos dos primeros pasos, consulte el repositorio functions-samples .
  3. Empuje el hecho de que el UID del usuario ha llamado a la función a una base de datos, probablemente agregándolo a una lista. Por ejemplo admin.database().ref(`/userCalls/$uid`).push(ServerValue.TIMESTAMP) .
  4. Consulta la cantidad de llamadas recientes con algo como admin.database().ref(`/userCalls/$uid`).orderByKey().startAt(Date.now()-60000) .
  5. Cuente los resultados y rechace si es demasiado alto.

No estoy seguro de si la dirección IP de la persona que llama se transfiere a Cloud Functions. Si es así, puede hacer la misma lógica para la dirección IP. Si no se pasa, será difícil calificar el límite de una manera que no se pueda falsificar fácilmente.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!