[解決済み] 料金制限のあるAPIを独自にDogfoodする
質問
概要です。
私の会社では、料金制限のあるAPIを開発しました。私たちの目標は2つあります。
- A: 私たちの製品の周りに強力な開発者エコシステムを作成します。
- B: 私たち自身のアプリケーションを駆動するためにそれを使用することによって、私たちのAPIのパワーを実証する。
明確にしてください。なぜレート リミットを行うのですか?
私たちは製品に追加する形でAPIを販売しているため、APIをレート制限しています。当社の API への匿名アクセスは、1 時間あたりの API 呼び出しの閾値が非常に低いのに対して、当社の有料顧客は 1 時間あたり 1000 回以上の呼び出しを許可されています。
問題点
私たちのレート制限付き API は開発者のエコシステムにとって素晴らしいものですが、私たちがそれをドッグフード化するためには、同じレート制限に制限されることを許可するわけにはいかないのです。私たちの API のフロント エンドはすべて JavaScript で、API に直接 Ajax 呼び出しを行います。
そこで質問です。
どのようにAPIを保護すれば、速度制限を解除することができ、速度制限を解除する過程で簡単になりすますことができないのでしょうか?
模索された解決策(と、それがうまくいかなかった理由)
-
ホストヘッダに対してリファラーを確認します。-- 欠陥があるのは リファラ は簡単に偽造されます。
-
を使用します。 HMAC を使って、リクエストと共有秘密に基づいて署名を作成し、 サーバ上でリクエストを検証します。-- 秘密とアルゴリズムは、フロントエンドのJavaScriptを調べれば簡単にわかるので、欠陥があります。
-
リクエストをプロキシし、プロキシ内で署名する --。 プロキシ自身がAPIを公開するため、まだ欠陥があります。
質問です。
私は Stack Overflow の優秀な頭脳に代替ソリューションを提示するよう求めています。あなたなら、この問題をどのように解決しますか?
どのように解決するのですか?
自分のJavaScriptクライアントが直接APIにアクセスしているわけですから、その内容を見て、同じAPIキーを使うなど、誰でも真似することができるようになります。コードを難読化したり、さまざまな障害を設けたりして、より難しくすることはできますが、あなたと抑制しようとしている相手は、根本的に同じアクセス権を持っているのです。権限に差をつけるのではなく、非公式クライアントがその範囲内のアクセスを全部使っても全然OKで、全クライアントでの公式利用が多くなるようにシステムを組む必要があります。
これはしばしば、アプリケーション全体に対して1つのトークンではなく、ユーザーごとのアクセストークンを使って行われます。各トークンの制限は、APIの典型的な使用には十分ですが、それを悪用しようとする人には制限的であるべきです。例えば、1分間に100回の呼び出しは一般的なブラウジングをサポートするには十分すぎるかもしれないが、私があなたをスクレイピングしたい場合、その予算では効果的に行うことができない。
私は多くのボット ユーザー アカウントを作成することによって、制限を回避することができます。しかし、それは、サインアップフローにキャプチャを追加するだけで、本当の人間にほんの少し負担をかけるだけで、かなり解決される問題です。このようなシナリオの場合、すべては利便性と制限のトレードオフに過ぎません。完全に防弾されたものを見つけることはできないので、十分に良いものを作ることに集中し、穴がどこにあったかを知るために誰かに悪用されるのを待つのです。
関連
-
[解決済み】REST APIでのPUTメソッドとPATCHメソッドの使い分け 実生活でのシナリオ
-
[解決済み] Amazon S3のクライアントブラウザからの直接ファイルアップロード - 秘密鍵の開示
-
[解決済み] jQuery scroll() は、ユーザーがスクロールを止めたことを検出する。
-
[解決済み] 文字列の最後の文字を取得するにはどうすればよいですか?重複
-
[解決済み] truthy や falsy を明示的なブール値、すなわち True や False に変換する。
-
[解決済み] JavaScriptでクエリ文字列が存在するかどうかを確認するには?
-
[解決済み] Reactjsで入力にフォーカスが当たったとき、すべてのテキストを選択するには?
-
[解決済み] JavaScript 予期せぬ事態に対する可能な反復処理
-
[解決済み] $.when.apply($, someArray)は何をするのですか?
-
[解決済み] ネストされたJSONオブジェクト - すべてに配列を使用しなければならないのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] モバイルWeb HTML5フレームワークの選び方【終了しました
-
[解決済み] Chart.jsを使ってドーナツチャートの中にテキストを追加するには?
-
[解決済み] selectタグのngModelの変更を検出する方法(Angular 2)?
-
[解決済み] Typescript流のMongoose...?
-
[解決済み] バックボーンビュー。親からイベントを継承・拡張する
-
[解決済み] JavaScriptのswitch文で厳密な比較を仮定するのは安全ですか?
-
[解決済み] Facebook Reactでコードを再利用するためのミキシンとコンポーネントの使い分け
-
[解決済み] 特定のクラスを持たない要素を選択する方法
-
[解決済み] ネストされたJSONオブジェクト - すべてに配列を使用しなければならないのか?