2011-05-20 11 views
4

次のようなサービスがあると仮定しましょう。

http://exmaple.com/service1/GetSomething?apikey= {API-キーになり、ここ}

私のAPIキーは次のとおりです。96a143c8-2f62-470c-b81f-dec5fc271873

ので、我々は>http://exmaple.com/service1/GetSomething?apikey=96a143c8-2f62-470c-b81f-dec5fc271873に呼び出しを作ることになりますJSONとして応答を返します。

JQuery(または他のクライアント側のJavaScriptライブラリ)を使用すると、その鍵はどのように安全になりますか?私はそれを考えていて、私は方法がないと思った。私がクライアントサイドコールでそのサービスに電話をかけようとするなら、それは私たちのものです。

これに関するご意見はありますか?

ありがとうございました。

答えて

9

プロキシを作成します。

あなたのページのいずれかに値を投稿し、このページからサーバー側で実際のリクエストを行い、取得した値を返します。

注:javascriptを使用してドメイン間のリクエストを行うことはできません。主にブラウザはセキュリティ上の理由からこれを許可していません。

+0

完全に正しい! +1! (注:JSONPを使用してクロスドメインリクエストをシミュレートすることができます) – jwueller

+0

@ BrunoLM ok、私はそれを部分的に理解しました。 *** 'javascriptでドメイン間のリクエストを行うことはできません' ***この文章に従って、http://exmaple.com/service1/GetSomething?apikey=96a143c8-2f62-470c-b81f-dec5fc271873サービスはできませんクライアントサイドのコードでhttp://example.orgから呼び出されます。右? – tugberk

+0

@ BrunoLMでも、私のアプリでそのサービスを利用するサービスを作成したと仮定します。このサービスのURLはhttp://example.co.uk/MyServiceです。このサービスには私のapiキーとすべてのものが含まれ、結果を返します。このサービスは、クライアント側のコード内で使用する私のサービスとなります。 smbdyがそのサービスを消費するのを阻止するものは何ですか?たとえば、フィドラー? – tugberk

2

クライアントの観点からを保護する唯一の方法は、サーバー上のAPIへのプロキシ要求を行い、そのキーをアプリケーションに追加することです。

+0

ありがとう。同じ質問:アプリでそのサービスを利用するサービスを作成したとしましょう。このサービスのURLはexample.co.uk/MyServiceです。このサービスには私のapiキーとそのすべてのものが含まれ、結果が返されます。このサービスは、クライアント側のコード内で使用する私のサービスとなります。 smbdyがそのサービスを消費するのを阻止するものは何ですか?たとえば、フィドラー?私が理解したように、HTMLマークアップのソースを見る能力を持つ人は、そのサービスを消費することができます。私は正しい方向にここにいるのですか? – tugberk

+2

これは別の問題です。実際には、プロキシが外部Webサービス自身への要求を処理するので、APIキーは効果的にマスクされます。しかし、あなたのHTMLを読んで適切なパラメータを使ってプロキシを呼び出す人は、外部サービスからの結果を消費できるはずです。さて、これはちょうど「基本的な」セキュリティ問題です。ユーザーがWebページを呼び出して別のWebページを認証しないようにするにはどうすればよいですか?セッション管理は、たとえば特定のユーザーのセッションでトークンを使用してトリックを行うことができます。または、あなたの要件に基づいて、IP – Grooveek

+0

hmmでいくつかのチェックのためのアクセスを制限することができます。したがって、Webページが呼び出されると、ページと私のサービスの間で共有されるトークンを作成することができます。したがって、私はトークンを私のサービスに渡して比較することができます。または、基本的に私のサービスからセッションコレクションにアクセスして、自分のトークンの特定のセッションを読むことができますか?私はできますか? – tugberk

0

私が見つけた最良のアプローチは、ユーザーにAPI_KEYとSECRET_KEYを与えることでした。

API_KEY、タイムスタンプ、および呼び出しに必要なその他のパラメータを渡してREST APIリクエストを作成します。

PHPのようなスクリプト言語を使用すると、SECRET_KEYで双方向暗号化を使用してAPI_SIGNATURE変数を作成し、それをベースURLに追加すると、それがあなたのリクエストとして実行されます。

誰もがそのリクエストを見ることができるので、タイムスタンプをパラメータとして使用するのはこのためです。基本的には、1分未満の要求のみを処理する制約を置くことができます。

例:(スクリプト言語でのこの部分を行う)

$API_BASE_URL="http://api.yourdomain.com/1.1/comments.json?api_key=2002&timestamp=2323234544&id=4"; 
$API_KEY=300; 
$API_SIGNATURE=hash_hmac('sha256', API_BASE_URL, API_KEY); 
$API_URL=$API_BASE_URL.'&api_signature='.$API_SIGNATURE; 

- あなたのjqueryのAjaxのURLで今すぐ

:PHPを使用しての$ API_URLをエコー。

- あなたのAPIで

あなたがユーザーを検索要求がAPI_KEYに基づいており、そのSECRET_KEYを取得し、署名を復号化し、渡されたものと一致することを確認することが今確認し合格した場合はアカウントを取得。タイムスタンプを作成し、要求が1分未満であることを確認してください。

リクエストを処理する前にレート制限と他のものを一括して送信することもできます。

それはそれです。


また、クロスドメインリクエストはブラウザで許可されていないと言われています。あなたがjsonを要求しているが、jsonpを使ってこれを回避することができればそれは本当です。


hash_hmacは、多くのプログラミング言語とスクリプト言語で利用できます。ですから、もしあなたがAPIを開発すれば、それはPHPでウェブ上で、また、目的のCであなたのiPhoneアプリでそれを使うことができます。

かなり簡単です。

関連する問題