0
6

More than 3 years have passed since last update.

node.js+ExpressでAPIに呼び出し制限を実装する

Posted at

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 リクエストが設定されたレート制限を超えたときに呼び出されます。

その他細かい設定はこちらを参考に

0
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
6