我正在开发一个REST API,让我有点迷失。我有一个用户模型,我将(盐渍)密码存储在数据库中。
考虑API的消费者: 我希望他们能够获得所有其他用户公共信息(GET / users,/ users /:id),但我希望忘记密码。
但是,例如,如果我想在常规PUT请求中更新登录用户的信息,那么我就不会在PUT请求中发送用户的现有密码 - 因此PUT请求只会进行部分更新用户在其他所有领域。这似乎不太RESTful。 (也许我应该使用PATCH?似乎补丁没有被广泛使用。这有什么原因吗?)
现在我正在考虑使用POST at /users/:id/updatePassword
来更新密码,然后使用PUT at /users/:id
来更新有关用户的所有其他信息,除了密码,并且无法从API检索用户密码
然而对我来说这感觉......很奇怪。也许不是,但只是想知道是否有人有更好的想法如何设计呢?
由于
答案 0 :(得分:1)
首先,您不应该存储您的用户密码加密。你应该对它们进行加盐和哈希并存储盐渍密码的哈希值。
用户的数据库模型不必将您在REST API中公开的资源与用户相匹配。当您使用PUT
更新用户时,您应该希望资源中的所有字段PUT
都是幂等的。
您建议更新密码的方式(使用POST /users/:id/updatePassword
完全正常且RESTful。在您的数据库模型中,您可以将密码哈希与用户的其他字段组合在一起,但在您的资源中,您保留他们分开了。