私はWebアプリケーション(Angularのシングルページアプリケーション)を所有しています。これは、(Play Framework 2.2.1を使用した)サーバー側アプリケーションに基づくREST APIのセットを通じていくつかのデータを要求します。
基本的に、私はセキュリティの専門家ではないので、最初は簡単に認証を実装するための「ツール」を使用したいと思いました。したがって、私は SecureSocial を使用することを選択しました。
私は自分のニーズに合わせてそれをカスタマイズしますが、REST認証方式に関するいくつかのドキュメントを読んだ後、私は間違った方法にある可能性が高いことに気付きました。
どうして?完全なステートレスソリューションではなく、セッショントークンメカニズムに基づいているからです。
つまり、認証ワークフローは次のとおりです。
このソリューションの長所:
..これは[〜#〜] restricted [〜#〜]APIへのアクセスを制御するのに適しています。
欠点:
HTTP BASICについて多くのことを聞いて読みましたが、それは避けるべきだと思われます: http://adrianotto.com/2013/ 02/why-http-basic-auth-is-bad /
次に、Amazonが実装するHMACソリューションについて読みましたが、それはかなり良いソリューションのようです。 OAuth1は複雑なように聞こえますが、簡単な場合には必要です。
HMACソリューションを実装する必要がありますか?
HMACソリューションはブラウザと本当に互換性がありますか?つまり、ユーザーが毎回認証する必要なく、いくつかの異なる操作を呼び出すことができますか?
このトリックを行うには、この場合のトークン交換が必要ですか?
Webアプリケーション/ブラウザーを扱っているときに、誰かがHMACの概念を紹介してくれたら本当に嬉しいです。
確かに、ブラウザと組み合わせたHMACスキームに関するドキュメントを見つけるのに苦労しています。
または、Oauthソリューションを本当に信頼していますか?...
私は主題について瞑想しています...
独自の認証をロールバックしないでください、Json Web Token(JWT)はあなたが望むことを実行できます、それはoAuthよりも簡単で、HMACを使用します
OAuthは、3者シナリオの場合に役立ちます。これは、クライアントがリソースサービスでアクセスできるものを決定する認証サービスがある場合です。このシナリオでは、クライアントは、認証サービスがユーザーに操作の実行を許可したことを証明するトークンを提供することにより、リソースに接続します。その音から、あなたは本当にOAuthを必要としません。
サーバー間APIを実行している場合(つまり、ユーザーのブラウザーではなく、別のサーバーからサービスにアクセスしている場合)、サービスがHTTPSで実行されている限り(つまり、暗号化されていないHTTPがない限り)、HTTP Basicは完全に問題ありません。 HMACは、この状況を実際にはより安全にしません。少なくともMITM攻撃者による改ざんを防ぐため、暗号化されていないHTTPでサービスを実行する必要がある場合はHMACが役立つことがありますが、最近のHTTPSのセットアップは非常に簡単であるため、HMACは誰よりもはるかに複雑です。
Basicよりも優れたセキュリティが必要な場合は、相互TLS認証(別名TLSクライアント認証)を使用できます。相互TLSは、非対称暗号化を使用するため、Basicよりも優れています。つまり、クライアントまたはサーバーのいずれかが侵害されても、他のキーのセキュリティは侵害されません。多くの状況では、この利点はそれほど重要ではありませんが、状況によっては適用される場合があります。
少し遅いのはわかっていますが、それを見て、とにかく答えようと思いました。 HMACは(Keyed) -Hash Message Authentication Codeです。 APIを保護するための仕組みは次のとおりです。メッセージと組み合わせてハッシュされるAPIトークンを作成します。このHMACは、ユーザー名とAPI呼び出しと共に送信され、APIサーバーに呼び出されます。
https://apiserver.com/api/?mac=098f6bcd4621d373cade4e832627b4f6&user=leaustinwile&command=url_encode({json:"test"})
。
次に、APIバックエンドはメッセージを受け取り、ユーザーのAPIトークンを見つけることにより、HMACサーバー側を計算します。
https://localhost/get_api_token/<user>
サーバー側で計算されたHMACがメッセージと共に送信されたHMACと一致する場合、メッセージが(インスタンスの正しいOriginから)正当であることが確認されているため、API呼び出しが呼び出されます。