web-dev-qa-db-ja.com

REST APIへのAjax呼び出しの保護

アプリでREST APIサービスを使用する必要があります。javascript/ jqueryから呼び出すため、エンドユーザーに公開する必要があります。

この場合、エンドユーザーに資格情報を公開する必要もありますが、これは避けたいものです。別の方法として、機密の認証情報を置き換えるトークンの使用を考えていますが、エンドユーザーがREST APIサービスを再利用したり、別のパラメーターで同じトークンを誤用したりしないようにするにはどうすればよいですか?

結論として、アプリケーションのみを保護してアプリケーションのみがREST APIを使用でき、エンドユーザー自身は使用できないようにする方法を教えてください。

[〜#〜]編集[〜#〜]

この質問にはいくつかの疑問があったので、はっきりさせておきたいと思います。たとえば、私のアプリのJavaScriptには、サードパーティのAPIを呼び出すajax呼び出しが含まれています。たとえばhttp://domain.com/api/insert-item?user=username&password=password&userid=1000&itemid=55555&itemvalue=10

ユーザーがクエリ文字列をuserid=2000&itemid=55555&itemvalue=100に変更できないようにするもの

ユーザーがサードパーティのAPIの資格情報を取得して、許可なしにそれを使用するのを阻止するものは何ですか?

6
John

できません。


言い換えましょう:不可能


トークンの使用を難しくすることができます。トークンごとの最大使用量、最大存続時間などを実装します...しかし、それが不可能であり、それがスクリプトキディであるか、APIにアクセスする「アプリケーション」であるかを知ることはできません。

多くの人は、それがAPIを呼び出すのではなく、アプリケーションであり、どのAPIを呼び出すかをクライアントに伝えることを忘れがちです。それ以外はすべて信頼に基づいています。そして、インターネットでは、信頼は廃止されました

12
Pinoniq

ユーザーがクエリ文字列をuserid = 2000&itemid = 55555&itemvalue = 100に変更できないようにするもの

何もない。

そのため、クライアントアプリからサードパーティにこの安全な呼び出しを行わないでください。

サードパーティアプリの機密認証情報をセキュリティで保護できる唯一の場所であるため、サーバー経由で作成する必要があります。

そのため、クライアントアプリはサーバー上のURLを呼び出し、サーバーは機密認証情報を含むHTTPリクエストをサードパーティアプリに送信します。サーバーが応答を受け取ると、このデータをクライアントアプリに返します。

クライアントアプリはサードパーティアプリと直接通信しないため、サードパーティアプリの認証情報は必要ありません。

2
Cormac Mulhall

yourクレデンシャルがJavaScriptで送信される場合、それらは秘密に保つことができません。

ただし、資格情報がサーバーに保存されている場合は、サーバー側の関数でそれらを使用することにより、秘密情報をcanに保持できます。

このようにして、サーバー側の機能を使用してJSからの受信リクエストを調べ、それが正当かどうかを判断できます。正当な場合は、資格情報を使用してそれを残りのAPIに渡すことができます。正当な場合は、エラーメッセージを送信します。

0

JavaScriptアプリケーションからサードパーティAPIに直接アクセスしないでください。代わりに、サードパーティAPIのラッパーのような独自の基本的なWebサービスを実装する必要があります。

次に、独自の小さなWebサービス内に独自の認証方法を実装するか、不要な場合は実装しないようにします。

ただし、次のようなハードコードされたページの背後にこれらの呼び出しを隠すことができます。

Example.phpは独自のサービスになります/example.phpはThird.Party/API/Example?Some=Complex&Strings=NoOne&Should=Seeを呼び出します

0
Matthias