2013-02-19 111 views
5

我正在使用ASP.NET Web Api編寫驗證密碼服務。REST驗證密碼服務

服務接受當前登錄用戶的密碼,驗證它並返回一個編碼值。這一切都發生在SSL上。

調用此方法不會導致狀態更改。

最初這看起來應該是一個GET請求但是在進一步檢查我很關心web服務器記錄純文本密碼。

我們可以將其作爲POST來實現,但這似乎是給出該操作的錯誤動詞。

這僅僅是一個過程中的實用主義案例,還是我們可以做更多的事情來實現實用和RESTful案例?

回答

1

您應該使用Basic Authentication,您將用戶名/密碼作爲標頭傳遞。這也符合已經定義的標準。

已經有一個javascript代碼用於執行base64編碼 - 如果您需要在瀏覽器上執行此操作。


如果您正在進行身份驗證並且編碼值是訪問令牌(cookie),則最好使用OAuth 2.0。

+0

感謝Aliostad。查看基本身份驗證的詳細信息,它不是我們所需要的(特別是缺點列表)。我們實際上並未在用戶中籤名,我們只是檢查當前登錄的用戶是否知道他們自己的密碼(更改某些設置時是密碼障礙)。 – 2013-02-19 13:32:18

0

如果API調用發送的響應本身不是資源(不涉及從數據存儲返回的資源),則應該使用非名詞動詞。

你可以有一個UserPasswordsController控制器暴露的操作方法是這樣的:

[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); 
} 

並擁有註冊路線是這樣的:

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

你會POST表單數據的驗證端點包含您希望驗證的用戶名和密碼。狀態爲禁止狀態表示密碼無效,如果密碼有效,則返回OK狀態。

如果您是新開發REST接口並希望採取務實的方法,我強烈建議您查看Web API Design - Crafting Interfaces that Developers Love