web-dev-qa-db-ja.com

トークンを検証するときにRESTful APIによって返されるステータスコードの良い習慣

クライアントのJavaScript SPAとHTTPS上のRESTful APIに取り組んでいます。

特定のトークンをSPAアプリケーション内で以前に有効(GET)にするには、クライアントアプリケーションがパブリックエンドポイント(トークンは不要)を呼び出す必要があります。

APIは次を返します:

  • トークンが有効な場合、ステータスコード200が返され、json値{"isValid": "true"}
  • トークンの形式が正しくない場合、ステータスコードコード200が返され、json値{"isValid": "false"}
  • トークンが無許可の場合、ステータスコードコード200が返され、json値{"isValid": "false"}

私が知りたいのですが:

  • 支援を受けた開発者は正しくAPIを設計しましたか?
  • 不正な形式のトークンの場合、APIは代わりにジェネリック400(「不正な要求」)を返し、401の場合(無許可)は許可されていないトークンを返します。

注:この質問はステータスコードに関するものだけではなく、エンドポイントがトークンを使用した認証を必要としないクライアントアプリケーションに情報を提供するパブリックエンドポイントの設計に関するものです。

6
GibboK

これは、APIの目的によって異なります。

目的がトークンの検証である場合、成功したリクエストに対して200 OKを返すことは賢明なようです。 4xxエラーは、トークンが無効であることではなく、検証APIのsageが正しくないことを意味します。

トークンがこのAPIへのアクセスを管理する場合、状況は異なります。その場合、トークンが有効かどうかを確認するためのエンドポイントは必要ありません。バックエンドはeveryリクエストでアクセストークンを確認する必要があります。次に、トークンが無効であるためにリクエストが失敗すると、Not Authorizedレスポンスが返されます。

REST APIはHTTPをtransportとして使用します。APIの実際のデータはHTTPレベルではなく、要求と応答の本文で表現されます。 HTTPヘッダーとステータスコードは、メタデータ、認証、および帯域外エラーメッセージングに使用できます。

ここでプログラミング言語に類似しています:API呼び出しはメソッド呼び出しに似ています。応答には戻り値(応答本文)が含まれます。ただし、HTTP応答のステータスが4xxまたは5xxの場合、つまり、メソッドが例外をスローし、正常に返されなかったかのようになります。

したがって、トークンの検証:結果としてtrue/falseを返す必要があります(そのデータを含む本文を含む200応答)、または何も返さないか、例外をスローする必要がありますか(2xx応答と4xx応答)?

8
amon

あなたはステータスコードを持っています、あなたはそれらを使うべきです:)

私が開発者がAPIを正しく設計していないのは、提案どおりにステータスコードを使用しているはずだからです。

したがって、リクエストに次のものが含まれる場合:

  • 有効なトークン
    • ステータスコード:200;
    • 本文:必要ありません。
  • 不正な(または欠落している)トークン
    • ステータスコード:400;
    • 本文:入力の問題点に関する情報を提供するJSONメッセージ。 {"errno": X, "error": "<error-message>"};
  • トークンは有効ですが、承認されていません
    • ステータスコード:401;
    • 本文:必要ありません。

JSONボディは必ずしも必要ではないことがわかるので、REST APIはJSONボディだけに依存するのではなく、HTTP(s)プロトコル全体のセマンティクスを使用する必要があります。


ステータスコードについては、 ここ および ここ を参照してください。

@AilurusFulgensが提案 このRFC4xxステータスコードでJSON本文を使用する方法を明確にすることは非常に役立ちます。

要約すれば:

  • 2xx:リクエストが成功したときに使用されます。
  • 3xx:リダイレクトを識別するために使用されます。
  • 4xx:リクエストに関するクライアントの問題に関する情報を提供するために使用されます。
  • 5xx:リクエストに関するサーバーの問題に関する情報を提供するために使用されます。
5
FredMaggiowski