2009-06-02 28 views
13

トークンを使用してサービスベースの認証方式を実装する方法の明確かつ簡潔な例を見つけるのに苦労しています。次のように私の知る限り、基本的な手順は以下のとおりです。トークンを使用したサービスベースの認証

  1. クライアントがアイデンティティプロバイダにユーザ名/パスワードを渡す
  2. プロバイダチェックのユーザ名/パスワードと送り返し
  3. ユーザーからユーザー名/パスワードを要求しますユーザーが有効な場合トークン
  4. クライアントはトークンで何かをしますか?

3番目と4番目のステップは、私が立ち往生している場所です。私はこの場合の "トークン"は、クライアントが解読できる暗号化された文字列か、クライアントが検証できるどこかに格納されたランダムな文字列でなければならないと確信していますクライアントがトークンを使ってやるべきこと、トークンが必要な理由など、単純なユーザーIDで十分ではありませんか?

答えて

25

それでは照合しますが、 私は本当にクライアントが何であるかわかりません トークンとするか なぜトークンが必要なのでしょうか - でも十分でしょうか?

いいえ - トークンは「乗るチケット」です。ちょうど地下鉄のトークンのように。クライアントは、サービスを要求するときにゲートキーパーに提示します。この場合、プロバイダは独自の認証を行い、クライアントはトークンをプロバイダに提示します。プロバイダーが認証を委任する場合もあります。たとえば、the STS modelの場合、プロバイダーはトークンを第三者に渡して認証や承認を行うことがあります。

ビューのサービスの観点から、このトークンは必要があります。

  • は「賞味期限」を持っています。それ以外の場合、トークンは無限に再利用可能になります。したがって、サーバー側では、トークンをセッションベースのストアに格納することができます。このストアでは、タイムアウトが発生します。または、期限切れの単純なハッシュテーブルを構築できます。
  • は、ホルダーにのみ関連付けることができます。多くの場合、プロバイダはここで近似を使用し、元の要求元IPアドレスからのみトークンを使用できると主張します。

手順3では、プロバイダーはユーザー名とパスワードを確認する必要があります。それが有効であれば、DictionaryまたはHashtableのエントリを参照するトークン(ハッシュ)を作成します。ハッシュテーブル内のオブジェクトは、ユーザー名、IPアドレス、おそらく元の発行時刻、おそらくユーザー名に関連付けられたロールなど、格納する必要があるものを含む構造体です。サービスプロバイダは、このトークン(構造ではなくハッシュ)をクライアントに、通常はセットクッキーとして返します。クライアントが後続の要求でトークンを(クッキーとして)返信すると、プロバイダは辞書をチェックして、トークンが利用可能かどうか、タイムアウトしていないか、要求しているIPアドレスと一致するか、すべては大丈夫です、リクエストを尊重してください。


EDITは、2013年6月

それは今、数年ぶりだし、この答えはまだ票を得ています。 OAuth 2.0フレームワークとベアラトークンを調べることをお勧めします。

基本的にはここに記載されているとおりです。

あなたが良い例の実装をしたい場合、あなたはApigee's Usergrid.を見ることができますそれはこのように動作します:

  1. ユーザーは

    POST https://api.usergrid.com/token -d '{"username":"Joe","password":"Sec4et!","grant_type" : "password"}'

  2. ユーザーが応答

  3. にaccess_tokenはを受け取り、認証します
  4. ユーザがヘッダで後続の呼び出しを行いますAuthorization: Bearer XXXXXXXXXX wここでXXXXXはベアラトークンに置き換えられます。このトークンには、ユーザグリッドサーバによって生存時間が設定されています。

+0

ここでは、トークンを持っている人は、自分が誰であるかを推測していると仮定しています。より安全にするための推奨方法はありますか? –

+0

私が遭遇した問題は、ユーザーがさまざまな要求に対して複数のIPアドレスを変更することです。元の要求とその後の要求は異なるIPからのものでした。 http://serverfault.com/questions/470931/user-http-requests-coming-from-multiple-ip-addresses – dan

+0

ウィキペディア州として - OAuth 2。OAuth 2.0は、署名、暗号化、チャネルバインディング、またはクライアント検証をサポートしていません。ある程度の機密性とサーバ認証のためにSSLに完全に依存しています。[14] [15] OAuth 2.0には、プロトコル自体はセキュリティ専門家によって本質的に安全ではないと記述されており、仕様の主要な貢献者は実装ミスはほとんど避けられないと述べている[17] [18]。 http://en.wikipedia.org/wiki/OAuth –

1

典型的なトークンは、サーバー側に格納されているランダムなハッシュです。クライアントは要求に応じてそれを戻します。これがあなたを得るのは、常にパスワードを回す必要がないことです。これは明らかにすべて有効です。パスワードを変更することなく、好きなときにトークンを無効にすることができます。

1

Amazon S3のこのドキュメントは、同じ問題を検討していたときに便利でした。

Authenticating REST Requests

一般的な原理は、これはその安全ではないとあなたが連続する各サービス呼び出しのためのユーザー名とパスワードの周りに渡すことにしたくないです。

あなたはサービスにユーザー名を渡すことについて言及しましたが、これもまた安全ではありません。

セッション状態を使用してユーザーが認証されたという事実を保存することを考えているかもしれませんが、これはRESTの一般原則の1つで、すべてがステートレスでなければなりません。私はこの場合の「トークン」はちょうど クライアントが解読できるという暗号化された文字列 または どこかで(すなわちデータベース) クライアントができることを格納されますいくつかの ランダムな文字列のいずれかであることを前提としてい

+0

より良いリンクがある...「APIキー」インフラストラクチャとユーザー名/パスワードを交換するとよいでしょうが、私はどのように「建築家」のようなもの見当もつかない.com/AmazonS3/latest/index.html?RESTAuthentication.html –

0

セッションのWebサービス... hmmmこれはどのようにすべきかではありません。 Webサービスは状態を保持するためのものではありません。
私はウェブ上で見て、ほとんどの例と記事はSSL/TLS +ユーザー名/パスワードについて話します。 ます。http://docs.amazonwebservices

関連する問題