hono-rate-limiterTaux limitant les middleware pour Hono. Utilisez pour limiter les demandes répétées aux API publiques et / ou aux points de terminaison tels que la réinitialisation du mot de passe.
Note
La fonction keyGenerator doit être définie pour que hono-rate-limiter fonctionne correctement dans votre environnement. Veuillez vous assurer de définir la fonction keyGenerator en fonction de la documentation avant d'utiliser la bibliothèque.
# Using npm/yarn/pnpm/bun
npm add hono-rate-limiter import { rateLimiter } from "hono-rate-limiter" ;
// Apply the rate limiting middleware to all requests.
app . use (
rateLimiter ( {
windowMs : 15 * 60 * 1000 , // 15 minutes
limit : 100 , // Limit each IP to 100 requests per `window` (here, per 15 minutes).
standardHeaders : "draft-6" , // draft-6: `RateLimit-*` headers; draft-7: combined `RateLimit` header
keyGenerator : ( c ) => "<unique_key>" , // Method to generate custom identifiers for clients.
// store: ... , // Redis, MemoryStore, etc. See below.
} )
) ; import { webSocketLimiter } from "hono-rate-limiter" ;
import { upgradeWebSocket } from "hono/cloudflare-workers" ;
import { RedisStore } from "@hono-rate-limiter/redis" ;
import { Redis } from "@upstash/redis/cloudflare" ;
const limiter = webSocketLimiter ( {
windowMs : 15 * 60 * 1000 , // 15 minutes
limit : 100 , // Limit each IP to 100 requests per `window` (here, per 15 minutes).
keyGenerator : ( c ) => "<unique_key>" , // Method to generate custom identifiers for clients.
store : new RedisStore ( { client } ) , // Define your DataStore. See below.
} ) ;
// Apply the rate limiting middleware to ws requests.
app . get (
"/" ,
upgradeWebSocket (
limiter ( ( c ) => {
return {
onOpen : ( ) => {
console . log ( "Connection opened" ) ;
} ,
async onMessage ( event , ws ) {
console . log ( `Message from client: ${ event . data } ` ) ;
ws . send ( "Hello from server!" ) ;
} ,
onClose : ( ) => {
console . log ( "Connection closed" ) ;
} ,
} ;
} )
)
) ; hono-rate-limiter prend en charge les magasins de données externes pour synchroniser le nombre de coups sur plusieurs processus et serveurs.
Par défaut, MemoryStore est utilisé. Celui-ci ne synchronise pas son état à travers les instances. Il est simple à déployer et souvent suffisant pour la prévention des abus de base, mais il sera incohérent entre les redémarrages ou les déploiements avec plusieurs processus ou serveurs.
Les déploiements nécessitant des limites de taux plus cohérentes appliqués doivent utiliser un magasin externe.
Voici une liste de magasins:
| Nom | Description |
|---|---|
| Mémoire | (par défaut) Option simple en mémoire. Ne partage pas l'état lorsque l'application a plusieurs processus ou serveurs. |
| @ Hono-Rate-Limiter / Redis | Un magasin soutenu par Redis, utilisé avec @vercel/kv et @upstash/redis . |
| @ Hono-Rate-Limiter / CloudFlare | Un magasin soutenu par Cloudflare, utilisé avec un objet durable, un WorkersKV et des travailleurs évaluent l'API limitant. |
| rate-limit-redis | Un magasin soutenu par Redis, plus adapté aux déploiements importants ou exigeants. |
| rate-limit-PostgreSQL | Un magasin à dosage de Postgresql. |
| à la limite de taux | Un magasin soutenu par soumis à Memcached. |
| store en cluster | Un wrapper de magasin de mémoire qui partage l'état sur tous les processus d'un seul serveur via le module Node: Cluster. Ne partage pas l'état sur plusieurs serveurs. |
| limite de taux de mémoire précise | Un magasin de mémoire similaire à celui intégré, sauf qu'il stocke un horodatage distinct pour chaque clé. |
| TypeOrd-Rate-Limit-Store | Prend en charge une variété de bases de données via Typeorm: MySQL, MARIADB, COCKROCHDB, SQLITE, Microsoft SQL Server, Oracle, SAP HANA, etc. |
| @ rlimit / stockage | Un magasin Rlimit distribué, idéal pour les déploiements multirégionaux. |
Jetez un œil à ce guide si vous souhaitez créer votre propre magasin.
keyGenerator détermine sur quoi limiter une demande, elle devrait représenter une caractéristique unique d'un utilisateur ou d'une classe d'utilisateurs que vous souhaitez évaluer la limite. Les bons choix incluent les clés API dans les en-têtes Authorization , les chemins d'ouverture d'URL ou les paramètres de requête spécifiques utilisés par votre application et / ou les ID utilisateur.Si les suggestions ici ne fonctionnent pas, veuillez essayer de publier des questions sur les discussions GitHub ou dans le canal #Help de Hono Discord.
Lorsque vous travaillez avec des forfaits qui ne sont pas officiellement soutenus par hono-rate-limiter , vous pouvez rencontrer des problèmes liés au type. Ceux-ci peuvent être facilement résolus en se référant aux discussions dans # 22, # 10. Exemple -
rateLimiter ( {
// ...
store : new RedisStore ( {
sendCommand : ( ... args : string [ ] ) => redisClient . sendCommand ( args ) ,
} ) as unknown as Store ,
} ) ;hono-rate-limiter avec des travailleurs ou des pages de cloudflare Si vous essayez d'utiliser hono-rate-limiter dans un environnement CloudFlare (comme les travailleurs ou les pages), vous pouvez rencontrer l'erreur suivante:
Uncaught Error: Disallowed operation called within global scope. Asynchronous I/O (ex: fetch () or connect ()), setting a timeout, and generating random values are not allowed within global scope. To fix this error, perform this operation within a handler. https://developers.cloudflare.com/workers/runtime-apis/handlers/ Cela se produit parce que le magasin de mémoire par défaut utilisé par hono-rate-limiter ne peut pas s'exécuter dans l'environnement CloudFlare en raison de ses restrictions sur les opérations asynchrones mondiales.
Pour résoudre ce problème, vous devez utiliser un magasin compatible pour CloudFlare. Vous pouvez utiliser le package @hono-rate-limiter/cloudflare , qui est spécialement conçu pour fonctionner avec l'infrastructure de CloudFlare.
Nous aimerions avoir plus de contributeurs impliqués!
Pour commencer, veuillez lire notre guide de contribution.
Le projet hono-rate-limiter est fortement inspiré par la limite de taux express