5

我正在使用 ASP.NET Web Api 编写验证密码服务。

该服务接受当前登录用户的密码,对其进行验证,然后返回一个编码值。这一切都发生在 SSL 上。

调用此方法不会导致状态更改。

最初这看起来应该是一个GET请求,但是在进一步检查后,我担心 Web 服务器会记录纯文本密码。

我们可以将其实现为 a POST,但这似乎是给定动作的错误动词。

这仅仅是一个实用主义优于程序的案例,还是我们可以做更多的事情来满足务实和 RESTful 的案例?

4

2 回答 2

1

您应该使用基本身份验证,将用户名/密码作为标头传递。这也更适合已经定义的标准。

已经有一个用于进行 base64 编码的javascript代码 - 如果您需要在浏览器上执行此操作。


如果您这样做是为了进行身份验证并且编码值是访问令牌 (cookie),则最好使用 OAuth 2.0。

于 2013-02-19T12:19:26.577 回答
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

于 2013-02-20T05:03:16.973 回答