125

これは概念的な質問です。

RESTful Web サービスに対するログイン アクションをサポートする必要があるクライアント (モバイル) アプリケーションがあります。Web サービスは RESTful であるため、これは、クライアントがユーザーからユーザー名/パスワードを受け入れ、そのユーザー名/パスワードをサービスで検証し、その後のすべての要求でそのユーザー名/パスワードを送信することを忘れないことになります。

この Web サービスの他のすべての応答は、JSON 形式で提供されます。

問題は、特定のユーザー名/パスワードが有効かどうかを確認するためだけに Web サービスにクエリを実行する場合、Web サービスは常に JSON データで応答して成功または失敗を通知するべきか、または適切な資格情報と HTTP で HTTP 200 を返すべきかということです。資格情報が正しくない場合は 401。

私が質問する理由は、資格情報が有効かどうかを尋ねるだけの場合でも、他の RESTful サービスの一部が不適切な資格情報に 401 を使用するためです。ただし、401 応答についての私の理解では、それらは有効な資格情報なしではアクセスできないはずのリソースを表しているということです。ただし、ログイン リソースの全体的な目的は、資格情報が有効かどうかを通知することであるため、ログイン リソースには誰でもアクセスできるようにする必要があります。

別の言い方をすれば、次のようなリクエストのように思えます。

myservice.com/this/is/a/user/action 

不正な認証情報が提供された場合、401 を返す必要があります。しかし、次のようなリクエスト:

myservice.com/are/these/credentials/valid

その特定の URL (リクエスト) は、有効な資格情報の有無にかかわらず承認されるため、401 を返すことはありません。

これについて何らかの形で正当な意見を聞きたいです。これを処理する標準的な方法は何ですか?また、これを処理する標準的な方法は論理的に適切ですか?

4

4 に答える 4

147

最初に。401 は、ログインに失敗したときに送信する適切な応答コードです。

401 Unauthorized 403 Forbidden に似ていますが、特に認証が必要で、失敗したか、まだ提供されていない場合に使用します。応答には、要求されたリソースに適用可能なチャレンジを含む WWW-Authenticate ヘッダー フィールドが含まれている必要があります。

myservice.com/are/these/credentials/validチェックを行うだけで401を送り返すことについてのあなたの混乱は、RESTでブール要求を行うことがRESTful制約によってしばしば間違っているという事実に基づいていると思います。すべてのリクエストはリソースを返す必要があります。RESTful サービスでブール値の質問を行うことは、RPC への滑りやすいスループです。

あなたが見たサービスがどのように動作しているのかわかりません。しかし、これを解決する良い方法は、GET しようとする Account オブジェクトのようなものを用意することです。資格情報が正しい場合は Account オブジェクトを取得します。「チェック」を行うためだけに帯域幅を浪費したくない場合は、同じリソースに対して HEAD を実行できます。

また、Account オブジェクトは、個別のリソースを作成するのが難しい厄介なブール値をすべて格納するのに適した場所でもあります。

于 2012-07-30T02:22:05.307 に答える
-6

適切なエラー メッセージとともに 409 を返します。

于 2019-11-13T19:00:56.257 に答える