【问题标题】:Change password in RESTful API (Server validation on PATCH)在 RESTful API 中更改密码(PATCH 上的服务器验证)
【发布时间】:2016-04-18 09:47:04
【问题描述】:

在 RESTful API 中,我在 /users 和 /users/:id 上拥有用户资源以及他们的用户名、电子邮件地址和密码。

当我想更新用户信息时,我可以轻松地使用一些 JSONPatch 数据执行 PATCH:/users/:id。

现在的问题是我不知道如何使用currentPassword、newPassword 和newPasswordConfirm 表单来处理更改密码 场景。

应该使用什么 METHOD(PATCH 似乎合适但有问题)以及应该以什么方式传输数据(body/header/...)。

在更广泛的范围内 - 如何处理带有更多验证字段的补丁。

This post 似乎相关,但并未涵盖这个确切的主题。

【问题讨论】:

    标签: rest http authentication web http-patch


    【解决方案1】:

    代替PATCH,部分更新用户资源,你有没有考虑过PUT替换密码?

    您的端点可以是/users/:id/password,其中password 是user 资源的子资源。您更换密码的请求如下:

    PUT /users/1/password HTTP/1.1
    Host: api.example.com
    Content-Length: 113
    Content-Type: application/json
    Authorization: Basic YWRtaW46c2VjcmV0
    
    {
        "currentPassword" : "secret",
        "newPassword": "othersecret",
        "newPasswordConfirm" : "othersecret"
    }
    

    【讨论】:

    • 我确实考虑过这个解决方案,但想避免在 API 上公开各个字段。除此之外,我更愿意使用POST 方法,因为PUT 操作被定义为幂等,而这个操作显然不是。
    • 您介意看看我的回答并提供反馈吗?
    【解决方案2】:

    在深入了解JSONPatch 之后,我想出了将test 操作添加到补丁数据的方法。

    这看起来有点像:

    [
        { "op": "test", "path": "/password", "value": "oldPassword" },
        { "op": "replace", "path": "/password", "value": "newPassword" },
        { "op": "test", "path": "/password", "value": "newPasswordConfirm" }
    ]
    

    使用这种方法有什么问题吗?

    【讨论】:

    • 我认为这种方法可以正常工作。但是,恕我直言,PUT 方法使其更清晰。
    • 好吧,可能会破坏交易的一件事是,我必须确保消费者确实使用这种请求格式。如果没有进一步的服务器端验证,消费者可以在没有测试用例的情况下发送替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2014-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多