Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9044

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

$
0
0

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

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


Viewing all articles
Browse latest Browse all 9044