web-dev-qa-db-ja.com

Webサービス呼び出しを認証するTOKENシステムを作成する最良の方法は?

モバイルデバイス、Winformsアプリケーション、iPhone、BlackBerryなど、さまざまなプラットフォームから呼び出せるWebサービスアーキテクチャを作成したいと思います。したがって、WCFやwsHttpバインディングのようなものを使用すると、おそらくこれが無効になり、互換性のためにbasicHttpバインディングにダウングレードする必要があります。

そうは言っても、最初のログイン(認証)時にトークンを生成し、それ以降のすべての呼び出しでこのトークンを使用して認証を検証し、メソッドを実行できるようにするシステムが必要です。

誰もがこれに対処する方法についてのヒントや提案がありますか? 1)トークンを生成し、安全なトークンには何が関係していますか? 2)トークンはどれくらいの期間有効ですか、一部のユーザーはアプリケーションを数時間使用し、場合によってはコンピュータを「スリープ」する可能性があります

アドバイスありがとう。

25
Neal

最初の認証でサーバーから提供されたトークンを1つだけ使用している場合、それがインターセプトされていれば、それをすべての要求に使用できます。あなたの唯一の防御は有効期限です。

それを超えて、それはあなたの実装オプションが何であるかに依存します。

より安全なシステムは、各要求にタイムスタンプ(および場合によってはナンス)を追加し、それに署名して、それを各要求に含めることです。クライアントが認証資格情報を処理し、署名の実装を認識し、各リクエストに署名する必要があります。

または、リクエストごとにサーバーを認証するか(OpenIDを使用して実行できます)、多数のトークンを渡して、さらに必要なときに再認証することもできます(OAuthを使用して実行できます)。クライアントが資格情報を保存できる場合、これらはユーザーには見えません。これらはより複雑で、一部の対話にはSSLなどの暗号化トランスポート、およびHTTPリダイレクトを読み、Cookieまたはその他の保存された状態を処理できるクライアントが必要です。クライアントは署名の方法を知っている必要はありませんが、SSLを実行できる場合は、そもそも複雑さは必要ないでしょう。

クライアントにとらわれる必要がない場合は、リクエストに署名することをお勧めします。

署名の実装、例、およびライブラリーについては、Amazon Web Services、OpenID、またはOAuthを参照してください。

トークンの有効期限については、ニーズによって異なります。トークンの寿命が長くなると、ウィンドウリプレイ攻撃が増加します。 nonceはトークンを使い捨てにしますが、サーバーでより多くの状態を必要とします。

16
Karl Anderson

OAuth を確認してください。これはAPI認証の標準であり、おそらく既存の実装をサービスにプラグインするだけです。

3
joeforker