2012-07-30 17 views
55

これは概念的な質問です。RESTfulログイン失敗:401またはカスタムレスポンスを返す

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

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

質問は、特定のユーザー名とパスワードが有効かどうかを調べるためにWebサービスに照会すると、Webサービスが常に成功または不成功を示すJSONデータで応答するか、良い資格情報と悪い資格情報のHTTP 401。

私が尋ねる理由は、資格情報が有効かどうかを尋ねているだけでも、他のいくつかのRESTfulサービスが悪い資格情報に対して401を使用しているということです。しかし、401応答の私の理解は、彼らがあなたが有効な資格情報なしでアクセスを持っていないと思われるリソースを表すことです。しかしログインリソースは、資格情報が有効かどうかを伝えることが目的であるため、誰でもアクセスできる必要があります(SHOULD)。

別の言い方をすれば、のような要求ように私には思える:悪い資格情報が提供されている場合

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

は401を返す必要があります。しかし、その特定のURL(要求)が有効な資格情報の有無に関係なく許可されているため、

myservice.com/are/these/credentials/valid 

は決して401を返してはなりません。

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

答えて

71

最初にオフにします。 401は、失敗したログインが発生したときに送信する適切な応答コードです。不正

禁断403と同様に、しかし具体的には認証が必要とされ、失敗したか、まだ提供されていない使用のため 。レスポンスには、要求されたリソースに適用可能なチャレンジを含むWWW-Authenticateヘッダーフィールドが含まれている必要があります。

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

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

アカウントオブジェクトは、個別のリソースを作成するためには別の方法では厄介なブール値を保存するのに適しています。

+1

リソースを返すことについてのあなたの意見は有効であると思われます。 401が適切な応答であると述べると、そこにいくつかの説明があります。私はあなたがここに含まれているように、HTTP仕様書を読んだことがありますが、私にはあなたの主張の直接的かつ明白な確認としては読めません。つまり、資格情報の有効性について尋ねる認証は必要ありませんが、あなたが含まれているのは「認証が必要な場合に特に使用する」ということです。 – Matt

+2

あなたの見方は正しいです。アカウントオブジェクトを要求するために認証する必要はありません。しかし、資格情報の妥当性を尋ねるのではなく、特定のリソースのために、リソースを受け取るためには正常に認証する必要があります。認証が必要で、失敗したか、まだ提供されていないものが適用されます。あなたが提供する資格情報に基づいて – Cleric

+0

私の意見はあいまいであると思います。アカウントのリソースが返された場合、私はあなたの同じページにいます - 私はあなたの立場に同意します。私が401について再度尋ねたとき、私は妥当性を求めているケースに関してのみ意味しました。私はこれがRESTのアプローチから「間違っている」ことを理解していますが、私はこの質問のために結論に達したいと思います。だから、私が間違ったことをして真理値を真偽値として返すのであれば、そのリクエスト/クエリに認証が実際には必要ないとすれば、401を返すのは不適切でしょうか? – Matt

関連する問題