node.js+ExpressでAPI作成するときに回数制限をかけたかったので実装メモ
#redisのインストール
Redisとは永続可能なインメモリデータベースです。
Redis上にアクセス情報を保持してアクセス制限を実施します。
yumでインストール
# yum install -y redis
バージョン確認
# redis-server --version
Redis server v=3.2.12 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=7897e7d0e13773f
redisサーバー起動
# sudo service redis start
#express-limiterの利用
回数制限をするミドルウェアのインストール
npm install express-limiter --save
var express = require('express')
var app = express()
var client = require('redis').createClient()
var limiter = require('express-limiter')(app, client)
/**
* you may also pass it an Express 4.0 `Router`
*
* router = express.Router()
* limiter = require('express-limiter')(router, client)
*/
limiter({
path: '/api/action',//リクエストへのルートパス
method: 'get',//対象のメソッド get、post、put、delete、all
lookup: ['connection.remoteAddress'],//制限対象のキー(この場合IPアドレスで制限)
total: 150,// 150回制限
expire: 1000 * 60 * 60, //制限対象の時間(ms)この場合1時間
onRateLimited: function (req, res, next) {//リミットに到達した場合の処理
next({ message: 'Rate limit exceeded', status: 429 })
}
})
app.get('/api/action', function (req, res) {
res.send(200, 'ok')
})
path: リクエストへのルートパス
method: httpメソッド。get、post、put、delete、all
lookup: 制限対象になるキー
total: 制限回数
expire: 制限対象の時間(ms)
whitelist: function(req) ホワイトリストの関数
skipHeaders: レート制限のためにHTTPヘッダーの送信をスキップするかどうか
ignoreErrors: redisから生成されたエラーにより、ミドルウェアがnext()を呼び出すことができるかどうか。デフォルトはfalseです。
onRateLimited: Function リクエストが設定されたレート制限を超えたときに呼び出されます。
その他細かい設定はこちらを参考に