[解決済み] ユーザ名/パスワードが正しくないが、正しい形式でログインしようとした場合に返すべき適切なHTTPステータスコードは何ですか?
質問
同様の質問がこちらに掲載されています。 REST APIサービスが検証失敗のために返すべき適切なHTTPステータスコードは何ですか?
上記のスレッドの回答では、"たとえば、URIがISO-8601の日付を持つことになっていて、それが間違った形式であったり、2月31日を参照していることがわかった場合、HTTP 400を返すことになります。また、エンティティ ボディに整形式の XML を期待していたのに、パースに失敗した場合も同様です。
しかし、ユーザーが正しくフォーマットされたデータを送信した場合はどうなるでしょうか。つまり、ユーザーはユーザー名とパスワード (これは私のアプリケーションでは完全に有効です) のために、プレーンなアルファベット文字列/テキストを送信しました。唯一の問題は、パスワードがユーザー名と一致しなかったということです。この場合、それは完全に有効な構文とウェルフォームであるため、400は不正確になります。
401 は正しくないでしょう (ここで提案されているように。 ユーザ名またはパスワードが正しくないと伝えるには、どのHTTPステータスコードを使用しますか? なぜなら、ユーザーはどのページにもアクセスしようとしておらず、単にログインしようとしていて、一致しないデータを入力したからです。
私がリンクした最初の投稿を振り返ると、2番目の回答は422が正しい応答であると述べています(そして、それは私には正しく見えます)、しかし、私はDjango Rest Frameworkを使っており、422はステータスコードの一部ではありません(DRFの一部であるステータスコードのリストは、ここで見つけることができます。 http://www.django-rest-framework.org/api-guide/status-codes/#client-error-4xx )
404もデータの受け入れに成功し、拒否されていないため、正しく表示されていません。
とはいえ、使用されるべき本当の正しい応答は何でしょうか?
どのように解決するのですか?
REST APIにRFC 7235で提供されているHTTP認証のフレームワークを厳密に使用している場合。 の場合、正しい HTTP コードは 401 となります。以下より RFC :
401 (Unauthorized) ステータスコードは、ターゲットリソースに対して有効な認証クレデンシャルがないため、リクエストが適用されなかったことを示す。 401応答を生成するサーバーは、対象リソースに適用可能な少なくとも1つのチャレンジを含むWWW-Authenticateヘッダーフィールド(セクション4.1)を送信しなければなりません(MUST)。
リクエストが認証クレデンシャルを含んでいた場合、401 レスポンスはそのクレデンシャルに対して認証が拒否されたことを示します。
ユーザーエージェントは、新しいまたは置き換えられたAuthorizationヘッダーフィールド(セクション4.2)で、リクエストを繰り返してもよい(MAY)。
あなたのREST APIは 認証スキーム を採用している必要があります。
RFC 7235 の 4 ページにある別の適切なセクションです。
保護されたリソースのリクエストで
のクレデンシャルを送信します。 無効な認証情報 (例: 不正なパスワード) を含んでいる。 または
部分的な認証情報 (たとえば、認証スキームが
が必要な場合など)。 オリジンサーバは 401 を送信すべきです。
(Unauthorized) レスポンスを送るべきです。 に適用できる少なくとも一つの(新しいかもしれない)チャレンジを含む 401
応答を送るべきです。
リクエストされたリソースに適用できる少なくとも一つの(おそらく新しい)チャレンジがあるWWW-Authenticateヘッダーフィールドを含んでいる。
視覚ユーザのためのレンダリングされたログインページ (保護されたリソースから 302 でリダイレクト) など、より高レベルのレスポンスは、(たとえば @KernelDeimos の回答に従って) 200 ステータスコードで提供される方が良いでしょう。ログインページは
通常
であり、独自のリソース (たとえば
/login?redirect=original-resource
など)、認証されていないユーザが不正なユーザ名/パスワードを提供したとしても、 このページを見ることが許可されます。そして、認証されたユーザーをリソースにリダイレクトします。このとき、許可されていれば200、リソースの閲覧が禁止されていれば403が表示されます。
401がビジュアルなログインページで活躍できる領域は、XHRリクエストを使用してREST APIを活用するフロントエンドのライブラリであり、次にREST APIからの401レスポンスを中継してログインページに意味のあるフォーマットに戻します。
関連
-
[解決済み] Wekaにおけるクロスバリデーション
-
[解決済み] JAX-WSによるサーバーサイドのスキーマ検証
-
[解決済み] reactとmaterial-uiによるフォームバリデーション
-
[解決済み] RESTを理解する。動詞、エラーコード、認証
-
[解決済み] REST APIサービスが検証に失敗した場合に返すべき適切なHTTPステータスコードは何ですか?
-
[解決済み】データのPOSTに対する400と422のレスポンス
-
[解決済み] Angularフォームフィールドを手動で無効に設定するにはどうすればよいですか?
-
[解決済み】Javaのメールアドレス検証方法は何が一番良いですか?[クローズド]
-
[解決済み】入力に誤りがあった場合のHTTPステータスコードについて
-
[解決済み] 一般的なリクエストに失敗した場合(エラーではない)、適切なHTTPステータスコードのレスポンスは何でしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Wekaにおけるクロスバリデーション
-
[解決済み] reactとmaterial-uiによるフォームバリデーション
-
[解決済み] IETFが定義するメールアドレスの実際の最小の長さはどのくらいですか?
-
[解決済み] 有効なメールアドレスの最大長を教えてください。
-
[解決済み] HTML5 form 要素の検証を無効にする
-
[解決済み] REST APIサービスが検証に失敗した場合に返すべき適切なHTTPステータスコードは何ですか?
-
[解決済み] Angularフォームフィールドを手動で無効に設定するにはどうすればよいですか?
-
[解決済み】Hibernate Validator(JSR303)でクロスフィールド検証を行う。)
-
[解決済み】Javaのメールアドレス検証方法は何が一番良いですか?[クローズド]
-
[解決済み】入力に誤りがあった場合のHTTPステータスコードについて