2012-12-22 7 views
15

要求を行うたびにHTTPS /暗号化を介してユーザー名、パスワードを送信する代わりに、REST Webサービスを使用する際に認証トークンを使用する価値は何ですか?RESTサービスでの認証トークンのポイント

OAUTHには、パスワードを第三者に譲渡する必要がないため、OAUTHには、ユーザー名とパスワードを共有したくない信頼できる第三者にトークンを渡すことができるという点を理解しています。

しかし、上記の特別な利点以外にも、私の場合は必ずしも必要ありません。毎回ユーザー名/パスワードを送信する代わりにトークンを使用するのはなぜですか?

これは、クライアントの生活を楽にするためのものであり、毎回ユーザー名とパスワードを送信する必要はありません。さて、クライアントは自分のトークンを覚えておいて、リクエストごとにトークンを送ってください。だから、ユーザー名/パスワードを覚えておいて/送信するのではなく、トークンに対して同じことをするでしょう!したがって、クライアントの実装コードはそれほど多くはありません。

ここで本当の価値は何ですか?

答えて

10

それは本当に、シナリオによって異なります - 。それはより多くを知らずに言うのは難しいですAPIについて - しかし、 "認証トークン"の使用は普遍的ではありませんが、多くのAPIはそれらを必要としない(使用しない)ことは間違いありません。しばしばHTTPS経由で傍受されないようにする)、ユーザーを識別するためのAPIキーと、ユーザーの身元を証明するための「秘密キー」による電子署名(When working with most APIs, why do they require two types of authentication, namely a key and a secret?を参照)を要求します。

ユーザー名/パスワードはパブリックAPIでよく使用される理由は、それらは十分に柔軟ではなく、ユーザーIDとアプリケーションIDとの間に十分な「分離」を提供しません。例えば。 Flickr APIを使用するための開発者として登録し、そのAPIを使用するiPhoneアプリを作成します。開発者のユーザー名/パスワードをアプリに組み込みたいのですか?後でパスワードを変更するとどうなりますか? 5つのアプリを開発し、それぞれ別々に使用状況を追跡し、他のアプリに影響を与えずにいつでもアプリを終了できるようにするにはどうすればよいですか?

しかし、ほとんどのシナリオでは、アプリケーション(たとえば、公開APIではなく独自のアプリケーションのみを提供するプライベートAPIバックエンドなど)ではなく、人間のユーザーのみを識別したい場合は、あなたが提案したものに何か間違っているものは見えません。つまり、リクエストごとにHTTPS上のユーザー名/パスワード。ああ、ところで、認証トークンには、「制限付き」(特定の時間に期限が切れる、特定のアクションのみに制限されるなど)という利点がありますが、これは非常に特定のシナリオでのみ有効です。

ALSO:上記のユーザー "Dan"が指摘しているように、すべてのリクエスト(または実際にはログインリクエストだけであっても実際にリクエストした場合)でユーザー名/パスワードを送信する必要があるAPIを設計する場合、それ。ブラウザがデフォルトでサポートする手法(HTTP Basic Authなど)を使用している場合、APIをブラウザから直接安全に呼び出すことはできません、つまりAJAX/Flash/Silverlightコードから)。

これは完全にここで説明することはできませんが、ブラウザが覚えているすべてのセキュリティ資格情報に依存している場合は、 、クッキー)、クロスドメインテクニック(CORS、JSONP、crossdomain.xmlなど)を使用してそのAPIへのクロスドメインアクセスを有効にすることは安全ではありません。

+0

すべての素晴らしい情報ですが、私は混乱しています; 1-私はどのように私のRESTジャージーサービスにユーザー名パスワードを送信する必要があります、私はHTTPヘッダーを送信する予定でした。 2 - そして、あなたが意味することを説明することができますか? "クロスドメインテクニックを使用してそのAPIへのクロスドメインアクセスを有効にすることは安全ではありません。"私はそれが何を意味するかはわかりません:) – Spring

+0

シナリオそれは、多くの開発者にとっては公開APIですか、独自のアプリケーションにバックエンドを提供するだけのプライベートAPIですか? APIまたは人間のエンドユーザを使用してアプリケーションを認証しようとしていますか? 2番目の段落(クロスドメインアクセスについて)で述べたすべてのことは、公開APIの場合にのみ重要です。*ユーザーがブラウザからアクセスできるようにする(FlashやSilverlightなどのAJAXコードから)。他のすべてのケースでは、あなたはそのことを無視することができます。 –

+0

tnxここに私のアプリが説明されています。 http://stackoverflow.com/questions/13997040/jersey-request-for-authentication – Spring

1

私がこれに答える最もよい方法は、this RESTセキュリティを説明するページを指すことです。これはジャージーではなく、レポレットwikiに属しますが、両方ともREST実装であるだけでなく、ジャージーにも適用できます。これは私が提供されるリンクから抽出された

を「最も抵抗のために、サーバはアプリケーションレベルの認証トークンをクライアントに提示することができ、サーバが検証できる不透明な値は、右認証されたユーザーに属しています。

  • このようなトークンは、例えば、ユーザの識別認証情報のサーバ塩漬けMD5またはSHA1ハッシュ、計算する第三者のために困難になるべきである。

  • XSRFを倒すために、THIアプリケーション・レベルのトークンは、ユーザー・エージェントが各要求とともに自動的に戻らないことを条件に送信する必要があります。例えば、それは隠しフィールドとしてフォームのHTMLで送信することができ、かつ符号化された形式のエンティティでPOSTを介して返さ「

+1

しかし、サードパーティは常にユーザー名/パスワードを推測するとサーバーからトークンを「取得」できる「/ login」Restメソッドにアクセスできますか? – Spring

+0

また、 "user-agentは各リクエストとともに自動的に返されません"という意味を説明することができますか?私のメソッドが "GET"の場合、リクエストヘッダに返信しませんか? – Spring

+0

答えを更新しました。 –

関連する問題