我正在使用 ASP.NET Web Api 编写验证密码服务。
该服务接受当前登录用户的密码,对其进行验证,然后返回一个编码值。这一切都发生在 SSL 上。
调用此方法不会导致状态更改。
最初这看起来应该是一个GET
请求,但是在进一步检查后,我担心 Web 服务器会记录纯文本密码。
我们可以将其实现为 a POST
,但这似乎是给定动作的错误动词。
这仅仅是一个实用主义优于程序的案例,还是我们可以做更多的事情来满足务实和 RESTful 的案例?
我正在使用 ASP.NET Web Api 编写验证密码服务。
该服务接受当前登录用户的密码,对其进行验证,然后返回一个编码值。这一切都发生在 SSL 上。
调用此方法不会导致状态更改。
最初这看起来应该是一个GET
请求,但是在进一步检查后,我担心 Web 服务器会记录纯文本密码。
我们可以将其实现为 a POST
,但这似乎是给定动作的错误动词。
这仅仅是一个实用主义优于程序的案例,还是我们可以做更多的事情来满足务实和 RESTful 的案例?
您应该使用基本身份验证,将用户名/密码作为标头传递。这也更适合已经定义的标准。
已经有一个用于进行 base64 编码的javascript代码 - 如果您需要在浏览器上执行此操作。
如果您这样做是为了进行身份验证并且编码值是访问令牌 (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 表单数据发送到包含您希望验证的用户名和密码的验证端点。Forbidden 状态表示密码无效,如果密码有效则返回 OK 状态。
如果您不熟悉 REST 接口并希望采用务实的方法,我强烈建议您查看Web API Design - Crafting Interfaces that Developers Love。