Webページでは、YUI接続マネージャー/データソースを使用してAJAX=要求をサーバーに送信します。セッション(ユーザーが認証されたかどうかに関する情報を含む)が既にタイムアウトしている場合、認証されたユーザーのみが表示できるajax応答は、httpステータスコードを返して、セッションが既にタイムアウトしたことをクライアントに伝える必要があります。その後、クライアントは単にログインページにリダイレクトするか、セッションを延長するかどうかを尋ねます。
私の質問は、この状況で、セッションがタイムアウトしたことをクライアントに伝えるのに最も適切なhttpステータスコードは何ですか?
WWW-Authenticateヘッダーを含むHTTP 401ステータスコードをお勧めします。
403リクエストの問題は、 RFC 2616 が「認可は役に立たず、リクエストは繰り返されるべきではない」ということです。 (つまり、認証されているかどうかは関係ありません。そのリソースにアクセスすることはありません)。
401リクエストの問題は、「WWW-Authenticateヘッダーフィールドを含める必要がある」ということです。 誰かが指摘している のように、WWW-Authenticateヘッダーでカスタム値を使用することは仕様に違反していないようです。
RFC 2617 で理由がわかりません。なぜ、HTTP 401ステータスがカスタムWWW-Authenticateヘッダーと組み合わされているのかはわかりません。
WWW-Authenticate: MyAuthScheme realm="http://example.com"
oAuth spec は、これを推奨しているように、実際にはこれを行うように見えます(ただし、RFCの奇妙な解釈を心に留めておく必要があります)。
WWW-Authenticate: OAuth realm="http://server.example.com/"
これはRFCによって具体的にSANCTIONEDされているようには見えませんが、実際に禁止されていることはわかりません(MUSTまたはMUST NOT、SHOULDまたはSHOULD NOT条件と競合していないようです)。
タイムアウトやCSRFトークンが無効になるなど、より明確なHTTPステータスコードがあればいいのにと思います。
HTTP 401をお勧めします。
403は基本的に「許可されず、立ち去って戻ってこない」と言いますが、401は「許可されているかどうかはわかりません。IDを持ってこなかったからです。Go」手に入れてもう一度やり直してください。」
比較 ウィキペディアの定義 :
HTTP 403-要求は正当な要求でしたが、サーバーは応答を拒否しています。
HTTP 401-403 Forbiddenに似ていますが、特に認証は可能であるが失敗したかまだ提供されていない場合に使用します。
419についてはどうですか-それは標準ではありませんが、 Wikipediaの説明 は収まるようです:
419認証タイムアウト
HTTP標準の一部ではない419 Authentication Timeoutは、以前に有効な認証が期限切れになったことを示します。認証されていないクライアントが特定のサーバーリソースへのアクセスを拒否されているのと区別するために、401 Unauthorizedの代替として使用されます。
適切なコードは403/Forbiddenになると思います。セッションに直接関連するものはありません。
真実は、セッションタイムアウト用の標準HTTPステータスコードはありません。セッションは、HTTPトランスポート層ではなく、アプリケーション層で実装されます。
Microsoftがセッションタイムアウトに使用しているカスタムステータスコード:599、または単に5xxの範囲で独自のステータスコードを構成しています。
ステータスコードWikiから:
599ネットワーク接続タイムアウトエラー(不明)このステータスコードはRFCでは指定されていませんが、Microsoft Corp. HTTPプロキシによって使用され、プロキシの背後のネットワーク接続タイムアウトをプロキシの前のクライアントに通知します。
セッションタイムアウトにカスタムステータスコード599を使用し、AJAX応答で確認します。
Http Status Codes のウィキペディアリンクに従って、上記のBoboから提供されたもの:
440 Login Timeout (Microsoft)
A Microsoft extension. Indicates that your session has expired.
リンクを投稿すると、そのリンクでこのHTTPステータスコード44が見つかりました。期限切れのセッションには440 HTTPステータスコードを使用できます。
440ログインタイムアウト
The client's session has expired and must log in again.
401ユーザーのログイン認証情報が間違っている場合に使用できます。または、ヘッダーで渡された認証トークンが無効です。
403リクエストされたリソースに対する特定の許可がユーザーにない場合、これを使用できません。
したがって、私の意見では440 Login Time-outを使用する必要があります。
技術的には、受け入れられた答えは正しいです:リクエストが失敗することを確実に知っていて、どの失敗コードを返すかを尋ねている場合、HTTP 401 "Unauthorized(Unauthenticated)"が適切です。プロンプト再認証に関して。
しかし、最初に、自問してみてください:リクエストに失敗しますか?
ユーザーがWebサイトの公開ページに単にアクセスしている可能性があることを考慮してください。この場合、「許可なし!」で顔を叩きます。通常は認証なしで表示できるページを表示するために、メッセージを再認証するよう要求します。それはクールではない。
私のアドバイスは、セッショントークンが不明であるという事実を無視し、新しいセッショントークンを生成し、そのための新しいセッションを作成するだけです。もちろん、セッションの初期状態は「未認証」であるため、ユーザーが非公開ページにアクセスしようとすると、ページはHTTP 401「Unauthorized(Unauthenticated)」を受け取ることを認識します。 「認証する必要があります。しかし、ユーザーが公開ページにアクセスした場合、ユーザーは別のことに気付かないでしょう。
「/ auth-required」などのリソースパスを指す「Location」ヘッダーを使用して、302リダイレクト応答を使用します。
クライアントは、ログイン/パスワードフォームを使用してモーダルにリソースパスをルーティングし、ユーザーを別のページに転送することを回避できます。