1. ホーム
  2. validation

[解決済み] ユーザ名/パスワードが正しくないが、正しい形式でログインしようとした場合に返すべき適切なHTTPステータスコードは何ですか?

2022-08-09 19:39:30

質問

同様の質問がこちらに掲載されています。 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レスポンスを中継してログインページに意味のあるフォーマットに戻します。