HTTP 401-適切なWWW-Authenticateヘッダー値とは何ですか?


109

現在作業中のアプリケーションには、セッションタイムアウト値があります。ユーザーがこの値を超えて操作しなかった場合、次のページを読み込もうとすると、ログインするように求められます。

行われたすべてのリクエストは、AJAX呼び出しを含むこのメカニズムを通じてルーティングされます。もともとはログインページで200ヘッダーを送信していましたが、200応答が送信された場合にコードが実行され、これらのRPC呼び出しから返されるほとんどのデータはJSONまたは評価される生のJavaScriptです(しないでください)。 :|)に尋ねます。

私たちのJSONパーサーはHTMLログインページを消費しないので、401の方が良いと提案しました。

しかし、仕様を読んだとき、WWW-Authenticateフィールドも送信する必要があることに気付きました。

このフィールドに適した値は何ですか?ウィルApplication Loginで十分?

回答:


67

HTTP基本認証を示すと、次のようなものが返されます。

WWW-Authenticate: Basic realm="myRealm"

一方Basic、スキームと残りはそのスキームに大きく依存しています。この場合、レルムは、ユーザーIDとパスワードを要求するときにユーザーに表示できるリテラルをブラウザーに提供するだけです。

ただし、基本認証を使用する場合はセッションの有効期限が切れないため、基本を使用していないことは明らかです。フォームベースの認証を使用していると思います。

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

秘訣は、それがサポートするスキームとそれがどのようにそれらに応答するかを決定するのはブラウザ次第であるということです。

フォームベースの認証を使用している場合の私の直感は、200 +再ログインページのままで、ブラウザーが無視するがAJAXは識別できるカスタムヘッダーを追加することです。

本当に良いユーザー+ AJAXエクスペリエンスを得るには、セッションが期限切れになったことを検出したAJAXリクエストにスクリプトを掛け、ポップアップを介して再ログインリクエストを開始し、成功したら、元のAJAXリクエストを再送信して通常どおり続行します。

5分ごとにスクリプトをサイトにヒットさせるだけのチートを避けて、セッションの存続期間を維持し、セッションの期限切れポイントを無効にします。

もう1つの方法は、AJAX要求を書き込むことですが、これはユーザーエクスペリエンスの低下です。


2
おかげで、リダイレクトではなく、元のページの代わりにログインフォームが文字どおり含まれているため、代わりに403を使用しています。また、W3仕様によりよく一致します。しかし、情報をありがとう。
モーガン、

2
:あなたはまだHTTP 401を使用する方法についてこの回答を参照してくださいstackoverflow.com/questions/928874/...
lanoxx

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

リクエストが私のajaxとブラウザのどちらで処理されているのかわからないため、WWW-Authenticateヘッダーに「何でも入れる」かどうかはわかりません。この質問のタイトルを超えて、フォームベースの認証を示唆する詳細を考えると、WWW-Authenticateヘッダーはまったく送信しません。これは、ブラウザーに認証/資格情報のチャレンジに参加するように要求していないためです。たまたまログオンフォームであるフォームを表示したいだけですが、ajaxがログオンフォームであることを識別するために使用できるものがあるため、上記とは異なる方法で処理できます。
スワニー2015年

ヘッダーで使用する認証スキームを作成する必要があります。その後、ブラウザはスキームを理解しないため、関与しません。ヘッダーを含めないと、一部のクライアントが混乱したり混乱したりします。
KayEss 2016年


-7

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

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

次にReload()関数を示します。

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

6
なぜHTTP 204を使用しているのですか?developer.mozilla.org/en-US/docs/Web/HTTP/Status/204
Will Morgan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.