Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

197
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda