| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Solid and easy to use rate limiting for hapi.
Installation · Usage · Plugin Options · Route Options · Response Headers
Follow @marcuspoehls for updates!
The Future Studio University supports development of this hapi plugin 🚀
Join the Future Studio University and Skyrocket in Node.js
A hapi plugin to prevent brute-force attacks in your app. The rate limiter uses Redis to store rate-limit related data.
hapi-rate-limitor is built on top of these solid and awesome projects:
Each package solves its own problem perfectly. hapi-rate-limitor composes the solutions of each problem to a solid rate limit plugin for hapi.
hapi v19 (or later) and Node.js v12 (or newer)
This plugin requires hapi v19 (or later) and Node.js v12 or newer.
| Major Release | hapi.js version | Node.js version |
|---|---|---|
| v3 | >=17 hapi | >=12 |
| v2 | >=17 hapi | >=8 |
Add hapi-rate-limitor as a dependency to your project:
npm i hapi-rate-limitorUse the 2.x release line:
npm i hapi-rate-limitor@2The most straight forward to use hapi-rate-limitor is to register it to your hapi server.
This will use the default configurations of async-ratelimiter and ioredis.
await server.register({
plugin: require('hapi-rate-limitor')
})
// went smooth like chocolate with default settings :)Customize the plugin’s default configuration with the following options:
All other options are directly passed through to async-ratelimiter.
await server.register({
plugin: require('hapi-rate-limitor'),
options: {
redis: {
port: 6379,
host: '127.0.0.1'
},
extensionPoint: 'onPreAuth',
namespace: 'hapi-rate-limitor',
max: 2, // a maximum of 2 requests
duration: 1000, // per second (the value is in milliseconds),
userAttribute: 'id',
userLimitAttribute: 'rateLimit',
view: 'rate-limit-exceeded', // render this view when the rate limit exceeded
enabled: true,
skip: async (request) => {
return request.path.includes('/admin') // example: disable rate limiting for the admin panel
},
ipWhitelist: ['1.1.1.1'], // list of IP addresses skipping rate limiting
getIp: async (request) => { // manually determine the requesting IP address
const ips = request.headers['x-forwarded-for'].split(',')
return ips[ips.length - 1]
},
emitter: yourEventEmitter, // your event emitter instance
}
})
// went smooth like chocolate :)You can also use a Redis connection string.
await server.register({
plugin: require('hapi-rate-limitor'),
options: {
redis: 'redis://lolipop:SOME_PASSWORD@dokku-redis-lolipop:6379',
extensionPoint: 'onPreAuth',
namespace: 'hapi-rate-limitor'
// ... etc
}
})
// went smooth like chocolate :)Please check the async-ratelimiter API for all options.
hapi-rate-limitor dispatches the following three events in the rate-limiting lifecycle:
Each event listener receives the related request as the only parameter. Here’s a sample listener:
emitter.on('rate-limit:exceeded', request => {
// handle rate-limiting exceeded
})You can pass your own event emitter instance as a config property while registering the hapi-rate-limitor plugin to your hapi server. By default, hapi-rate-limitor uses hapi’s server as an event emitter.
const EventEmitter = require('events')
const myEmitter = new EventEmitter()
await server.register({
plugin: require('hapi-rate-limitor'),
options: {
emitter: myEmitter
// … other plugin options
}
})Customize the plugin’s default configuration on routes. A use case for this is a login route where you want to reduce the request limit even lower than the default limit.
On routes, hapi-rate-limitor respects all options related to rate limiting. Precisely, all options that async-ratelimiter supports. It does not accept Redis connection options or identifiers for dynamic rate limiting.
All other options are directly passed through to async-ratelimiter.
await server.register({
plugin: require('hapi-rate-limitor'),
options: {
redis: {
port: 6379,
host: '127.0.0.1'
},
namespace: 'hapi-rate-limitor',
max: 60, // a maximum of 60 requests
duration: 60 * 1000, // per minute (the value is in milliseconds)
}
})
await server.route({
method: 'POST',
path: '/login',
options: {
handler: () {
// do the login handling
},
plugins: {
'hapi-rate-limitor': {
max: 5, // a maximum of 5 requests
duration: 60 * 1000, // per minute
enabled: false // but it’s actually not enabled ;-)
}
}
}
})
// went smooth like chocolate :)Please check the async-ratelimiter API for all options.
To make use of user-specific rate limits, you need to configure the userAttribute and userLimitAttribute attributes in the hapi-rate-limitor options.
These attributes are used to determine the rate limit for an authenticated user. The userAttribute is the property name that uniquely identifies a user. The userLimitAttribute is the property name that contains the rate limit value.
await server.register({
plugin: require('hapi-rate-limitor'),
options: {
userAttribute: 'id',
userLimitAttribute: 'rateLimit',
max: 500, // a maximum of 500 requests (default is 2500)
duration: 60 * 60 * 1000 // per hour (the value is in milliseconds)
// … other plugin options
}
})This will calculate the maximum requests individually for each authenticated user based on the user’s id and 'rateLimit' attributes. Imagine the following user object as an authenticated user:
/**
* the authenticated user object may contain a custom rate limit attribute.
* In this case, it’s called "rateLimit".
*/
request.auth.credentials = {
id: 'custom-uuid',
rateLimit: 1750,
name: 'Marcus'
// … further attributes
}For this specific user, the maximum amount of requests is 1750 per hour (and not the plugin’s default 500).
hapi-rate-limitor uses the plugin’s limit if the request is unauthenticated or request.auth.credentials doesn’t contain a rate-limit-related attribute.
The plugin sets the following response headers:
Do you miss a feature? Please don’t hesitate to create an issue with a short description of your desired addition to this plugin.
MIT © Future Studio
futurestud.io · GitHub @futurestudio · Twitter @futurestud_io
| Back | FazBrowse Home | New Git URL |