身份验证的REST服务设计

时间:2012-07-18 18:02:15

标签: authentication rest

我想为身份验证和帐户管理设计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吗?我很困惑。

2 个答案:

答案 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