私は、ユーザーにアプリケーションデータベースを利用して情報を提供するWebサービスを提供しています。ユーザーはAPIキーを登録し、リクエストを行う際にAPIキーを提供する必要があります。すべて正常に動作しますが、キーを登録したユーザーが実際にリクエストを出しているのか、キーを与えている他の誰かがチェックしていないのを確認するにはどうすればよいですか?REST WebサービスとAPIキー
私は最後の2日間は解決策を見出すことを考えてきましたが、それまでは何もありませんでした。
私は、ユーザーにアプリケーションデータベースを利用して情報を提供するWebサービスを提供しています。ユーザーはAPIキーを登録し、リクエストを行う際にAPIキーを提供する必要があります。すべて正常に動作しますが、キーを登録したユーザーが実際にリクエストを出しているのか、キーを与えている他の誰かがチェックしていないのを確認するにはどうすればよいですか?REST WebサービスとAPIキー
私は最後の2日間は解決策を見出すことを考えてきましたが、それまでは何もありませんでした。
署名されたリクエストを使用する必要があります。基本的にはそのように動作します:
リプレイ攻撃を避けるために、ナンスとタイムスタンプをミックスに追加することもできます。ナンスは、単に各リクエストでクライアントがインクリメントする必要のある数字です。リクエストを受け取った時点で、以前にこのノンス/タイムスタンプを既に受け取っているかどうかをチェックします。そうした場合、リクエストを拒否します(リプレイ攻撃の可能性が高いためです)。そうでない場合は、ナンス/タイムスタンプをデータベースに保存し、後でそれを参照できるようにします。
これは、多かれ少なかれ、OAuthでのリクエストの署名方法です。リンクの例を見てください。
REST APIコールの認証には2つの部分があります。ユーザーがサービスに登録すると、通常、そのユーザーを識別するKEYが割り当てられます。時には、これで十分です。しかし、このKEYは共有することも、盗むこともできます。その場合、あなたのサービスは引き続きKEYが有効であるとみなします。今、キーハイジャックなどを防ぐために秘密鍵を配布します。このキーは、REST APIリクエストでは転送されません。このキーは、APIリクエストの一方向ハッシュを実行し、署名(HMAC)を作成するために使用されます。
この署名とAPIリクエスト(URL形式のHTTPリクエスト)は、APIサーバーに送信されます。サーバーはURLの一方向ハッシュを実行し、このユーザーの秘密キーを使用して署名と比較します。一致した場合、リクエスタが秘密鍵にアクセスすることを「想定」しているため、要求は有効です。
リプレイ攻撃を避けるために、nonce(前のポスターで提案されているように)に加えて、ハッシュチェインを使用することもできます。
JAVAやPHP(または他のもの)を使用していますか? – sp00m
サーバ側の言語はPHP – slash197
@Laurentが答えたとおり、OAuthプロセッサを見てもらえますが、私はOAuth2を提案します。ポストが少し古くても、そのメカニズムのPHP実装を見つけることができます(http://stackoverflow.com/q/4875420/1225328)。 PS:GoogleとFacebookの両方がOAuth2を使用して、開発者がAPIと通信できるようにします。 – sp00m