我正在使用ASP.NET Web Api編寫驗證密碼服務。REST驗證密碼服務
服務接受當前登錄用戶的密碼,驗證它並返回一個編碼值。這一切都發生在SSL上。
調用此方法不會導致狀態更改。
最初這看起來應該是一個GET
請求但是在進一步檢查我很關心web服務器記錄純文本密碼。
我們可以將其作爲POST
來實現,但這似乎是給出該操作的錯誤動詞。
這僅僅是一個過程中的實用主義案例,還是我們可以做更多的事情來實現實用和RESTful案例?
我正在使用ASP.NET Web Api編寫驗證密碼服務。REST驗證密碼服務
服務接受當前登錄用戶的密碼,驗證它並返回一個編碼值。這一切都發生在SSL上。
調用此方法不會導致狀態更改。
最初這看起來應該是一個GET
請求但是在進一步檢查我很關心web服務器記錄純文本密碼。
我們可以將其作爲POST
來實現,但這似乎是給出該操作的錯誤動詞。
這僅僅是一個過程中的實用主義案例,還是我們可以做更多的事情來實現實用和RESTful案例?
您應該使用Basic Authentication,您將用戶名/密碼作爲標頭傳遞。這也符合已經定義的標準。
已經有一個javascript代碼用於執行base64編碼 - 如果您需要在瀏覽器上執行此操作。
如果您正在進行身份驗證並且編碼值是訪問令牌(cookie),則最好使用OAuth 2.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。
感謝Aliostad。查看基本身份驗證的詳細信息,它不是我們所需要的(特別是缺點列表)。我們實際上並未在用戶中籤名,我們只是檢查當前登錄的用戶是否知道他們自己的密碼(更改某些設置時是密碼障礙)。 – 2013-02-19 13:32:18