1

我想设计用于身份验证和帐户管理的 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 会更好吗?我很困惑。

4

2 回答 2

5

不要那样做。请勿出于任何原因在 URL 中输入密码。

在这种情况下,我对您尝试做的事情感到有些困惑——通常,REST API 中的身份验证/授权不是由资源本身处理的,但是如果您正在设计一个单独的身份验证 API,也许这个说得通。简单的答案是,将身份验证数据放在请求的正文中,然后通过 SSL 发送它们。所以

 POST https://server/security/changePassword/

并在正文中有数据。并确保用户必须在您的服务中进行身份验证!

从 REST 设计的角度来看,将 POST 视为对主体执行操作的服务。理想情况下,让它响应 200/201 状态和带有创建/修改资源 URL 的 Location 标头。

PUT 旨在在 URL(而不是查询参数)包含要创建资源的位置时使用。

可以说,这将是一个平静的举动

GET https://server/security/{username}/{email}/forgottonPassword/

但这有点滥用......坚持这些帖子。

如果您尝试对资源进行身份验证,则 Authorization 标头(名称错误,但要使用的标头)是这些标头的位置。

在这种情况下,进行用户名/密码身份验证的标准休息方式称为基本身份验证

于 2012-07-18T18:17:20.777 回答
4

在对 REST 风格的服务进行建模时,您会考虑资源。资源是一个user. 您要公开的服务(不好,因为在服务中考虑强制 RPC 样式)是身份验证并获取稍后可用于授权 HTTP 标头的安全令牌、忘记密码和更改密码功能。

首先,我们对在基本 URL 下始终可访问的资源用户进行建模

https://server/user/{username}

要进行身份验证,我们需要一些安全令牌,以便我们可以向创建安全令牌的用户子资源发出 POST:

POST https://server/user/{username}/securityToken

这会发出一个新的安全令牌,我们可以在 HTTP 授权标头中使用它。我在POST这里发出请求,因为我们将 securityToken 建模为 user 的某种子资源user/someusername/securityToken。您可以使用在安全令牌下创建的子资源向用户公开功能以查看所有成功或失败的登录请求。

接下来我们要请求忘记密码。这里重要的是request。这意味着我们发出请求并创建用户的新密码忘记请求子资源。为了创建子资源,REST 风格使用POST

POST https://server/user/{username}/password/request

这可以(但不是必须的)为每个密码请求创建一个子资源,该子资源只有在经过身份验证时才能访问。因此,您可以公开一个 REST 样式的 URL,用户可以在其中获取随时间发出的所有密码请求。

现在更改密码的最后一个功能非常简单,因为我们拥有用户的密码子资源,我们可以POST对密码资源发出请求:

POST https://server/user/{username}/password
于 2012-07-18T19:02:38.713 回答