2009-11-17 15 views
93

私が現在取り組んでいるアプリケーションには、セッションのタイムアウト値があります。ユーザーがこの値を超えて対話していない場合、次のページがロードしようとすると、ログインするように求められます。HTTP 401 - 適切なWWW認証ヘッダー値は何ですか?

すべてのリクエストは、このメカニズムを介してルーティングされます。これにはAJAX呼び出しが含まれます。もともと私たちは200ページのレスポンスが送信され、これらのRPCコールから返されるデータのほとんどがJSONまたは評価される生のJavaScriptであるため、AJAXのいくつかの問題を紹介するログインページを200ヘッダに送信していました。質問:|)。

は、私たちのJSONパーサがHTMLログインページを消費しようとはしませんので、401は、優れていることを示唆しました。.. :)

reading the specが、しかし、私が気づいたときWWW-Authenticateフィールドがなければならないことまた送られる。

このフィールドにはどのような値が適していますか? Application Loginで十分ですか?

答えて

58

我々のようなものを返します。この場合、realmはユーザーIDとパスワードの入力を求めるプロンプトが表示されたときに、ユーザーに表示できるリテラルをブラウザに提供します。

Basic認証を使用すると、セッションの有効期限がないため、Basicを使用していないことは明らかです。私は、フォームベースの認証のいくつかのフォームを使用していると仮定します。

想起から、Windowsチャレンジレスポンスは異なるスキームと異なる引数を使用します。

どのようなスキームがサポートされているか、どのように応答するかはブラウザによって異なります。

フォームベースの認証を使用しているのであれば、200 + reloginページにとどまりますが、ブラウザが無視するがAJAXが識別できるカスタムヘッダーを追加するのは難しいでしょう。

本当に良いUser + AJAXエクスペリエンスを得るには、セッションが期限切れになったAJAXリクエストにハングアウトし、ポップアップでreloginリクエストを発し、成功したら元のAJAXリクエストを再送信していつものように。

5分ごとにサイトにヒットするスクリプトを取得する不正行為を避けて、セッションの有効期限を守るためにセッションを有効にします。

もう1つの方法は、AJAXリクエストを焼くことですが、それはユーザーエクスペリエンスが悪いことです。

+1

おかげでチームメイト、それがリダイレクトし、それはないので、私は今の代わりに403を使用しているクライアント側では、私はこれを行います文字通り元のページの代わりにログインフォームが含まれています。また、W3仕様によく似ています。しかし、情報をありがとうございます。 –

+2

HTTP 401の使い方については、この回答を参照してください。http://stackoverflow.com/questions/928874/how-do-i-keep-firefox-from-prompting-for-username-password-with-http-basic -auth/19102200#19102200 – lanoxx

+0

はい、WWW-Authenticateヘッダーに何かを入れるだけです。同様の脈絡での別の答えはhttp://stackoverflow.com/a/1088127/689161です。単に仕様に違反し、ヘッダーの送信を気にしないでください(少なくともいくつかのサイトでこれを行います)。 401は403よりもさらに適切です。 – gengkev

6

いいえ、使用する認証方法(通常は「基本」)と認証領域を指定する必要があります。要求と応答の例については、http://en.wikipedia.org/wiki/Basic_access_authenticationを参照してください。

RFC 2617 - HTTP Authentication: Basic and Digest Access Authenticationもお読みください。 Basicスキームで、残りはそのスキームに大きく依存しているのに対し

WWW-Authenticate: Basic realm="myRealm" 

:HTTP基本認証を示すとき

-3

ユーザーセッションがタイムアウトすると、HTTP 204ステータスコードが返されます。 HTTP 204ステータスにはコンテンツが含まれていないことに注意してください。ここで

xhr.send(null); 
if (xhr.status == 204) 
    Reload(); 
else 
    dropdown.innerHTML = xhr.responseText; 

はリロード()関数です:

function Reload() { 
    var oForm = document.createElement("form"); 
    document.body.appendChild(oForm); 
    oForm.submit(); 
    } 
+2

どのようにHTTP 204を使用していますか? https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/204 –

関連する問題