24

こんにちは、この質問についてのこの観察と質問を以前にすでに書いていますが、後でそれが古くて「死んだ」質問であることに気づきました。他の人からの洞察が本当に欲しいので、私はそれを新しい質問として再投稿しています。

認証をRESTfulに行う方法については、一般的に「HTTP認証」と熱狂的に叫びます。しかし、それらの人々が(マシンツーマシンのWebサービスではなく)RESTを使用してブラウザーベースのアプリケーションを作成しようとしたことがあるかどうかは疑問です。(犯罪は意図されていません-私は彼らが合併症に直面したことはないと思います)

ブラウザで表示するHTMLページを生成するRESTfulサービスでHTTP認証を使用する際に私が見つけた問題は次のとおりです。

  • ユーザーは通常、ブラウザで作成された醜いログインボックスを取得しますが、これはユーザーにとって使い勝手がよくありません。パスワードの取得、ヘルプボックスなどを追加することはできません。
  • ログアウトまたは別の名前でログインするのは問題です-ウィンドウを閉じるまで、ブラウザは認証情報をサイトに送信し続けます
  • タイムアウトは難しい

これらにポイントごとに取り組む非常に洞察に満ちた記事がここにありますが、これは多くのブラウザ固有のjavascriptハッカー、回避策の回避策などにつながります。そのため、上位互換性もありません。新しいブラウザがリリースされるたびに、定期的なメンテナンスが必要になります。クリーンでクリアなデザインだとは思いません。それに、RESTバッジを友達に熱心に見せるためだけに、余分な作業と頭痛の種がたくさんあると思います。

クッキーが解決策だと思います。しかし、待ってください、クッキーは邪悪ですよね?いいえ、そうではありません。Cookieの使用方法は悪です。Cookie自体は、ブラウザが閲覧中に追跡するHTTP認証情報と同様に、クライアント側の情報の一部にすぎません。また、このクライアント側の情報は、HTTP認証情報と同じように、要求ごとにサーバーに送信されます。概念的には、唯一の違いは、このクライアント側の状態の内容が、サーバーの応答の一部としてサーバーによって決定される可能性があることです。

次のルールだけでセッションをRESTfulリソースにすることによって:

  • セッションは、キーをユーザーID(および場合によってはタイムアウトのlast-action-timestamp)にマップします
  • セッションが存在する場合、それはキーが有効であることを意味します。
  • ログインとは/sessionsにPOSTすることを意味し、新しいキーがCookieとして設定されます
  • ログアウトとは、/ sessions / {key}を削除することを意味します(POSTがオーバーロードされている場合、私たちはブラウザであり、HTML 5はまだ長い道のりです)
  • 認証は、リクエストごとにCookieとしてキーを送信し、セッションが存在して有効であるかどうかを確認することによって行われます。

HTTP認証との唯一の違いは、認証キーがサーバーによって生成され、クライアントが入力された資格情報から計算するのではなく、サーバーによって生成され、送信し続けるクライアントに送信されることです。

これは問題なく機能する十分なソリューションだと思いますが、このスキームの潜在的な穴を特定するのに十分なセキュリティの専門家ではないことを認めなければなりません-私が知っているのは、RESTfulではない何百ものWebアプリケーションが本質的に同じものを使用していることだけですログインプロトコル($ _ SESSION inphp、j2eeのHttpSessionなど)。cookieヘッダーの内容は、accept-languageを使用して翻訳リソースなどにアクセスするのと同じように、サーバー側のリソースをアドレス指定するために使用されます。同じように感じますが、そうでない人もいるかもしれません。どう思いますか?

4

2 に答える 2

4

興味深い質問です。mod_rewrite と PHP を使用して、現在 REST API の実装を仕上げています。HTTPS 全体で HTTP 基本認証を使用します。これまでのところ、Palm Pre クライアントに取り組んでいます。そのクライアントを開発している担当者は、リクエストごとに送信するユーザー資格情報を追跡する必要があることに少し気が進まなかった.

SESSION をリソースとして公開するというアイデアは興味深いものです。それを含めても、厳密な RESTful 原則に違反します。SESSION をリソースとして公開したとしても、サーバーを使用してクライアントの状態を追跡することになります。REST に厳密に準拠するには、おそらく Cookie を使用する必要があります。Cookie は、ブラウザーから利用できるクライアント側の永続的なメモリだからです。問題は、ユーザーがブラウザーで実装された HTTP 資格情報の収集と対話したくない場合に、クライアント側で HTTP 要求を管理するために JavaScript (または FLash?) クライアントを作成する必要があることです。

私が便利だと思ったツールの 1 つは、REST Client for Firefox ツールです。ただし、それを使用している場合でも、標準のブラウザー ポップアップに資格情報を入力します。

私の実装にいくつかのハックが含まれていることを認めなければなりません。セッションを使用して、潜在的な開発者または何かによる API のテスト/閲覧を可能にするだけである場合、セッションベースの認証を使用することはそれほど大したことではないと思います。純粋主義者は同意しないでしょう。本当にそれがこれに帰着するものです...これは本質的に学術的な議論です。現実の状況では、うまくいくことをしなければなりません。

... 2012 年 10 月 23 日にこれに追加 ...

クライアントが自身の状態を追跡できるようにするという RESTful な方法論の主張は、単に学問的なものではありません。これは、公開されたリソースのスケーラビリティとアドレス指定可能性に重要な意味を持ちます。これを言うとき、クライアントの状態によって、RESTful インターフェイスによって発行される応答に影響を与える、要求しているユーザーに固有の属性について話していると仮定します。REST の強みの 1 つは、そのアドレス可能性です。リクエストで渡されなかった情報に何らかの方法で依存する応答を行うと、それを削り始めます。余談ですが… 3年後ですね笑。

于 2009-07-16T18:27:43.593 に答える
1

これは少し古い質問であることは承知していますが、ここでの質問の多くはさまざまな分野で対処されていると思います。特に、 OAuth 2.0 プロトコルはこれらの質問の多くを検討してきたと思います。ここで回答の要約を提供するほど信頼できるとは思いませんが、リンクされたサイトには、明示的に呼び出されたさまざまなユースケースがたくさんあります。これは、完全な OAuth 2.0 が実際には必要ない場合でも、この質問には非常に役立つようです。ここ。

于 2011-06-08T17:40:29.060 に答える