クロスドメインスクリプトをしっかりと可能にするJavaScript APIを設計するにはどうすればよいですか?
-
27-09-2019 - |
質問
Google MapsのAPIが消費される方法が好きで、スクリプトが含まれていますが、心配です。
私のAPIは「セミプライベート」です。つまり、インターネットでアクセス可能ですが、データと何らかの認証の安全な送信を可能にする必要があります。データはワイヤー上でプライベートのままである必要があり、ある消費者は別の消費者のデータを取得できないはずです。
SSLと何らかの認証を使用して、データを安全に保つにはどうすればよいが、サーバー側のプロキシが必要ないプレーンHTMLページから「水平方向に」アクセス可能に保つにはどうすればよいですか?キーを管理する必要がありますか?傍受されることなく、キーはどのようにサーバーに投稿されますか? OpenID(または他のサードパーティ認証)を使用してAPIユーザーを認証できますか、それとも独自の認証メカニズムを作成する必要がありますか?私はGoogle全体で行ってきましたが、APIを安全にデザインして展開するための良いガイドを見つけることができません。
現在、私はそれらを消費するためにRESTとAJAXを使用していますが、クロスドメインコールは不可能です。正しい方向の助けやポインターは大歓迎です。
解決
おそらく、パブリックキー暗号化されたクエリ文字列のキーを含むSSL URLを使用して、動的に生成されたスクリプトタグを使用します。サーバーは、秘密キーを使用して、関連する情報を含むクエリ文字列パラメーターとリターンスクリプトを復号化します(または、キーが無効であった場合)。またはそれらの線に沿って何か。しかし、私は実際に実際にそれをしなければならなかったことを認めます。
また、AmazonのS3サービスのような以前のアートを探しています。
それで:
- ユーザーは秘密を提供します
- クライアント側のコードは、公開キーを使用して秘密を暗号化します
- JavaScriptの追加a
script
URLを含むタグ - サーバーはスクリプト要求を処理し、秘密を復号化し、それをチェックし、関連する応答を送り返します。
それ以外の場合は、サーバーへのリクエストが中間の攻撃を介して再利用される可能性があるため、2つのサイクルが必要になる場合があります。それは次のとおりです。
- JavaScriptの追加a
script
一意のキーを要求するタグ(おそらく、ソースIPやランダムなキーなど、いくつかの交絡情報があります) - サーバーは、そのIPに結び付けられた1回限りのキーで応答します
- ユーザーは秘密を提供します
- クライアント側のコードは、#1の一意のキーを含む秘密を暗号化するために公開キーを使用します
- JavaScriptの追加a
script
URLを含むタグ - サーバーはスクリプト要求を処理し、秘密を復号化し、それをチェックし、関連する応答を送り返します。
- 応答は、#1に含まれるランダムキーを使用して(ある程度)暗号化される可能性があります
私が実際にやったことはありません。 (または私は?bwaa-ha-ha-ha ...) fwiw。
他のヒント
OAUTHは、ユーザーがサードパーティのアプリケーションにログインし、XHRリクエストを行うときにリクエストトークンを使用してアプリケーションに代わって3番目のパーティにアクセスできるようにすることで、この状況に役立つ可能性があります。 http://oauth.net/documentation/getting-started/
========
サーバー側のプロキシを使用する理由は、Webブラウザーに組み込まれた同性のポリシーに要約されます。 http://en.wikipedia.org/wiki/same_origin_policy
基本的に、ブラウザは、ページが届くアドレスにリクエストを行うことができます(たとえば、Facebook.comはFacebook.com URISにのみリクエストを行うことができます)。サーバー側のプロキシは、現在のオリジン以外のサーバーにリクエストを行うことにより、この問題を解決します。サーバー側のプロキシは、このようなリクエストを作成するためのベストプラクティスでもあります。
OpenSource JavaScript Forge Projectをご覧ください。安全なクロスドメインXHRリクエストを可能にするJavaScript TLS実装を提供します。それはあなたに役立つかもしれません:
http://digitalbazaar.com/2010/07/20/javascript-tls-1/
http://digitalbazaar.com/2010/07/20/javascript-tls-2/
https://github.com/digitalbazaar/forge
1つの潜在的な解決策:
- Apacheサーバーをセットアップしてサイトを実行します。
- サイトのSSL証明書を取得します。
- Forgeに付属するApache Modをインストールして、他のサイトにアクセスできるようにするクロスドメインポリシーをセットアップします。
- PEM形式でサイトの証明書とともに、サイトでのForgeのTLS実装をホストします。
- 他のサイトに、サイトからJavaScriptを含めるように指示し、それを使用してサイトに安全な電話をかけて、必要なものを何でも実行します。
- (サードパーティ)ページは、OAuthまたは同様のものを使用して、ユーザーを認証し、サーバーからトークンを取得します。
- ページSSLを介してサーバーからiframeをロードして、認証のためにトークンを渡します。
- iframeはSSLを介してサーバーに安全に通信できます
- 使用する EasyXDM または、作成したRPCのような限られたAPIまたはソケットのようなAPIを使用して、IFRAMEとサードパーティのページ間で通信するようなもの。
または、サードパーティを本当に信用していない場合 - IFRAME内で認証を行い(OAuthの必要はありません。単純なHTMLフォームを使用するだけです)、easyXDMを使用してユーザーについて外側のページが知る必要があるものは何でも通信します。
質問が正確に何であるかがわかりませんが、[http://egual.comのデータを処理/表示するために、[https://secure.com]にJSONPのような電話をかけようとしていると思います。 ]?
2つのサーバーは互いに話し合うことができますか?このようなことはどうですか:
ユーザーは[https://secure.com]にログインします
認証時に、Secure.comはトークンを生成し(Syntokenと呼びましょう)、それをsession_id、任意のメッセージ、およびOTP暗号(Syncipherと呼びましょう)のように、sersion_id、arbitrarymessのように直接渡します。 。
Broswerはsession_id cookieを受け取り、Secure.comがブラウザをリダイレクトします http://multion.com/setcookieandredirect?session_id=blabla&otpencryptedsynmessage=blabla
remulary.comは、session_idをキーとして使用してOTP暗号を調べ、otpencryptedmessage "blabla"を復号化します。
復号化されたメッセージがSyntokenの元のメッセージと一致する場合、ユーザーが[remulary.com]にログインしていることを確認でき、remulal.comは別のトークン(Acktoken、lolzと呼びましょう)を生成し、[Secure.com]に直接渡します。 session_id、いくつかの任意のACKメッセージ、および別のOTP暗号(Ackcipherと呼びましょう)。
その後、remulary.comはブラウザにotpencryptedackmessageで構成されるCookieを送信します(このCookie "verified_session"に名前を付けましょう)。
ページの読み込みが終了します。
そこから、JSONPのような呼び出しを行うことができます
https://secure.com/getscript.js?query=dataname&veriedtoken =(verified_sessions_cookie_value)
secure.com/getscript.jsは、[Secure.com]がキーとして送信した元のCookie Session_idに基づいてAckcipherを検索し、otpencrypedackmessageを解読します。復号化されたメッセージがACKメッセージと一致する場合、スクリプトファイルをレンダリングします。
それはちょっと3ウェイの握手のようなものです。秘密のソースは、サーバーが秘密のキーを個別にパスするために直接互いに話し合うことができる必要があることです。両方のサーバーに同じsession_idを使用する必要はありません。私はそれを簡単な参照ポイントとして使用して、Syn/ACK OTP暗号にアクセスする方法を見つけていました。暗号は一般から完全に隠されている必要があります。