2017-02-10 2 views
0

サードパーティのAPIと統合されたNode Express/Angular Civicプロジェクトで作業しています。それぞれの通話は1.00ドルです。私はそれの特定の部分に資金を提供していますが、私は第三者へのPOST要求を停止したいと思います。なぜなら、私は数千ドルのコストで終わらせたくないからです。サードパーティAPIはレート制限をサポートしていません。NodeエクスプレスでPOSTリクエストをカウンタでラップし、エラーをスローします。x

私はデータベースを構築したり、authを作成することができますが、私はそのルートに行くことや支払いゲートウェイを統合したくないです。しかし、私は個人的な理由からこれらのソリューションを好むわけではありません。 IPアドレスごとに制限されている部分的なソリューション/ノードモジュール(高速レート制限)が出てきました。しかし、これは依然として、x回の呼び出しに達した後に要求を停止するという問題を解決しません。

var RateLimit = require('express-rate-limit'); 

app.enable('trust proxy'); // only if you're behind a reverse proxy (Heroku, Bluemix, AWS if you use an ELB, custom Nginx setup, etc) 

var apiLimiter = new RateLimit({ 
    windowMs: 15*60*1000, // 15 minutes 
    max: 1, // 1 call every 15 minutes 
    delayMs: 0 // disabled 
}); 

// only apply to requests that begin with /api/ 
app.use('/api/', apiLimiter); 

さらに優れたソリューション/ベストプラクティスはありますか?それは、いくつかの人々を助けることができる単なるサイドプロジェクトですが、多くの人がそれを使い始めるとコストを負担して壊れたくありません。ありがとう!

+0

[発現レート制限コード(https://github.com/nfriedly/express-rate-limit/blob/master/lib/express-rate-limit.js)※超です*シンプル。確かにあなたのニーズにそれを適応させることができます。 'keyGenerator'関数を変更して(IPアドレスの代わりに)何らかの定数を返すだけでうまくいくはずです。 –

+0

@ jordan:あなたの答えに感謝します。実際の例を見せてもらえますか? –

+1

私はちょうどいくつかのコードをドロップすることができますので、いいえ、申し訳ありません私の前にエクスプレスアプリを持って起こることはありません。 (だからこそ、私は答えではなくコメントを投稿した。) –

答えて

0

ヨルダンのように、constを設定して定数を返します。これは、異なるIPアドレス間でレート制限の状態を維持します。

const keyIp = "127.0.0.1"; 

var limiter = new RateLimit({ 
    windowMs: 2147483647, // store key for node max 
    max: 3, // limit each IP to 1 requests per windowMs 
    // delayMs: 24*60*60*60, // delaying - 24 hours 
    message: "Sorry, the maximum limit of 50 letters sent has been reached. Thank you for participating!", 
    keyGenerator: function (req, res) { 
     return keyIp; 
    } 
}); 

app.use('/api/letter', limiter); 
関連する問題