2013-02-19 3 views
5

ASP.NET Web APIを使用してパスワードの確認サービスを作成しています。RESTfulパスワードサービスの確認

サービスは、現在サインインしているユーザーのパスワードを受け取り、それを検証し、エンコードされた値を返します。これはすべてSSL上で発生します。

このメソッドを呼び出すと、状態は変更されません。

当初はこれはGETリクエストであるように見えましたが、それ以上の検査ではプレーンテキストのパスワードを記録しているウェブサーバーが心配です。

私たちはこれをPOSTとして実装することができますが、それはアクションが与えられている間違った動詞のようです。

これは単に手順に対するプラグマティズムのケースですか、それとももっと実用的なケースとRESTfulなケースの両方を満たすためにできるのですか?

答えて

1

ユーザー名/パスワードをヘッダーとして渡す場合は、Basic Authenticationを使用してください。これはすでに定義されている標準と同じくらい適しています。

ブラウザでこれを行う必要がある場合、base64エンコーディングのコードはすでにjavascriptです。


認証するためにこれを行い、エンコードされた値がアクセストークン(Cookie)である場合は、OAuth 2.0を使用する方がよいでしょう。

+0

ありがとうAliostad。 Basic Authの詳細を見ると、必要なものではありません(特に欠点のリスト)。私たちは実際にユーザーにサインインするのではなく、現在サインインしているユーザーが自分のパスワードを知っているかどうかをチェックしています。 –

0

API呼び出しがリソース自体ではない(データストアから返されたリソースを含まない)応答を送信する場合は、名詞以外の動詞を使用する必要があります。

あなたは、このようなアクションメソッド公開しUserPasswordsControllerコントローラー持つことができます。あなたはその検証エンドポイントにフォームデータをPOSTう

routes.MapHttpRoute(
    name:   "UserPasswords", 
    routeTemplate: "api/v1/validate", 
    defaults:  new { controller = "userpasswords" } 
); 

[HttpPost()] 
public HttpResponseMessage Validate() 
{ 
    if (!this.Request.Content.IsFormUrlEncodedContent()) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.BadRequest, 
      "Body of request must be form URL encoded." 
     ); 
    } 

    var parameters = this.Request.Content.ReadAsFormDataAsync().Result; 

    var userName = parameters["userName"]; 
    var password = parameters["password"]; 

    // TODO: Validate user name and password 
    var isValid = true; 

    if(!isValid) 
    { 
     return this.Request.CreateErrorResponse(
      HttpStatusCode.Forbidden, 
      String.Format(null, "The password provided for {0} is not valid.", userName) 
     ); 
    } 

    return this.Request.CreateResponse(HttpStatusCode.OK); 
} 

そして、このように登録したルートを持っているが検証するユーザー名とパスワードが含まれています。禁止状態のステータスはパスワードが無効であることを示し、パスワードが有効であればOKのステータスを返します。

RESTインターフェイスを初めて使用していて、実用的なアプローチを取りたい場合は、Web API Design - Crafting Interfaces that Developers Loveをご覧ください。