2012-06-14 10 views
6

私は、ユーザーにアプリケーションデータベースを利用して情報を提供するWebサービスを提供しています。ユーザーはAPIキーを登録し、リクエストを行う際にAPIキーを提供する必要があります。すべて正常に動作しますが、キーを登録したユーザーが実際にリクエストを出しているのか、キーを与えている他の誰かがチェックしていないのを確認するにはどうすればよいですか?REST WebサービスとAPIキー

私は最後の2日間は解決策を見出すことを考えてきましたが、それまでは何もありませんでした。

+0

JAVAやPHP(または他のもの)を使用していますか? – sp00m

+0

サーバ側の言語はPHP – slash197

+0

@Laurentが答えたとおり、OAuthプロセッサを見てもらえますが、私はOAuth2を提案します。ポストが少し古くても、そのメカニズムのPHP実装を見つけることができます(http://stackoverflow.com/q/4875420/1225328)。 PS:GoogleとFacebookの両方がOAuth2を使用して、開発者がAPIと通信できるようにします。 – sp00m

答えて

10

署名されたリクエストを使用する必要があります。基本的にはそのように動作します:

  • あなたはあなたのユーザーにあなたとクライアントだけが知っているAPIキー「秘密」(ランダムな文字列)を得ました。
  • リクエストを行うたびに、「署名」パラメータが追加されます。この署名は、基本的にリクエストパラメータ+ APIキー+他のパラメータ(下記参照)+シークレットのハッシュです。
  • 秘密を知っているので、署名が正しいことを確認することができます。

リプレイ攻撃を避けるために、ナンスとタイムスタンプをミックスに追加することもできます。ナンスは、単に各リクエストでクライアントがインクリメントする必要のある数字です。リクエストを受け取った時点で、以前にこのノンス/タイムスタンプを既に受け取っているかどうかをチェックします。そうした場合、リクエストを拒否します(リプレイ攻撃の可能性が高いためです)。そうでない場合は、ナンス/タイムスタンプをデータベースに保存し、後でそれを参照できるようにします。

これは、多かれ少なかれ、OAuthでのリクエストの署名方法です。リンクの例を見てください。

+0

ありがとう!興味深いと思う、私はこれをチェックしなければならない。 – slash197

+0

ユーザが秘密鍵を譲り渡した場合、あなたは自分の身元を正しく検証できません。 APIキーと秘密キーの適切な使用を指示する必要があります(技術ではなくポリシー)。それにもかかわらず、これは良い情報です。トラフィックのスニッフィング(APIキー/パラメータ)またはリクエストパラメータを推測するリプレイ攻撃はどのようなシナリオで適用されますか? – KyleM

+0

@KyleM、はい、それはMITM攻撃を防ぐためです。私は接続がhttpsを超えていればそれほど重要ではないと思う。 –

2

REST APIコールの認証には2つの部分があります。ユーザーがサービスに登録すると、通常、そのユーザーを識別するKEYが割り当てられます。時には、これで十分です。しかし、このKEYは共有することも、盗むこともできます。その場合、あなたのサービスは引き続きKEYが有効であるとみなします。今、キーハイジャックなどを防ぐために秘密鍵を配布します。このキーは、REST APIリクエストでは転送されません。このキーは、APIリクエストの一方向ハッシュを実行し、署名(HMAC)を作成するために使用されます。

この署名とAPIリクエスト(URL形式のHTTPリクエスト)は、APIサーバーに送信されます。サーバーはURLの一方向ハッシュを実行し、このユーザーの秘密キーを使用して署名と比較します。一致した場合、リクエスタが秘密鍵にアクセスすることを「想定」しているため、要求は有効です。

リプレイ攻撃を避けるために、nonce(前のポスターで提案されているように)に加えて、ハッシュチェインを使用することもできます。