我想为身份验证和帐户管理设计REST服务。请告诉我以下内容是否满足REST风格。
POST http://server/security/authenticate?username=xxx&password=yyy
POST http://server/security/forgotPassword?username=xxx&email=yyy
PUT http://server/security/changePassword?oldPassword=xxx&newPassword=yyy
HTTP方法是否POST& PUT就在这儿?由于身份验证不会修改任何内容,因此最好在此处使用GET吗?我很困惑。
答案 0 :(得分:5)
不要那样做。不要出于任何原因将密码放在URL中。
在这种情况下,我对您尝试执行的操作感到有点困惑 - 通常,REST API中的身份验证/授权不是由资源本身处理,而是在设计单独的身份验证API ,也许这是有道理的。简单的答案是,将身份验证数据放在请求正文中,然后通过SSL发送。所以
POST https://server/security/changePassword/
并将数据存储在正文中。并确保用户必须在您的服务中进行身份验证!
从REST设计的角度来看,将POST视为在主体上执行操作的服务。理想情况下,让它以200/201状态响应,并使用创建/修改资源的URL进行Location头。
当URL(而不是查询参数)包含要创建资源的位置时,将使用PUT。
可以说,做一个宁静的举动
GET https://server/security/{username}/{email}/forgottonPassword/
但这有点滥用......坚持帖子。
如果您尝试对资源进行身份验证,则授权标头(错误名称,但要使用的标头)就是那些。
在这种情况下,进行用户名/密码身份验证的标准休息方式称为Basic Authentication
答案 1 :(得分:4)
在建模REST样式服务时,您会考虑资源。资源是user
。您希望公开的服务(因为服务中的思维强制RPC样式)是可以进行身份验证并获得一个安全令牌,以后可以在Authorization HTTP标头中使用,忘记密码并更改密码功能。
首先,我们为在基本URL
下始终可访问的资源用户建模https://server/user/{username}
要进行身份验证,我们需要一些安全令牌,以便我们可以向创建安全令牌的用户的子资源发出POST:
POST https://server/user/{username}/securityToken
这会发出一个新的安全令牌,我们可以在HTTP Authorization标头中使用它。我在这里发出一个POST
请求,因为我们将securityToken建模为用户user/someusername/securityToken
的某种子资源。您可以使用在安全令牌下创建的子资源向用户公开功能,以查看所有成功或失败的登录请求。
接下来我们要申请忘记的密码。这里重要的是request
。这意味着我们发出请求并创建用户的新密码忘记请求子资源。对于创建子资源,REST样式使用POST
:
POST https://server/user/{username}/password/request
这可以(但不是必须)为每个密码请求创建一个子资源,只有在经过身份验证时才能访问。因此,您可以公开REST样式的URL,用户可以获得随时间发布的所有密码请求。
现在更改密码的最后一项功能非常简单,因为我们拥有用户的密码子资源,我们可以在密码资源上发出POST
请求:
POST https://server/user/{username}/password