登录 REST Web 服务

login in REST web service

我正在尝试开发我的第一个 REST Web 服务,我对登录过程授权用户执行某些匿名用户无法执行的操作有很大疑问。 我的想法是:

  1. 用户向服务发送用户名和密码(通过 https)
  2. 服务检查数据库中是否存在这些内容
  3. 如果存在这些,服务会生成一个加密令牌(包含生存时间(例如 10 分钟)和用户 ID)并将其发送回用户。
  4. 在每个用户的请求中,服务检查是否 token is valid : 如果它有效服务于请求,重新生成一个新的 令牌并发回给用户,否则不授权该操作。

现在的问题是:"is a good approach for security???" 如果没有,你能告诉我一个替代方案吗?

非常感谢!

我担心的一个问题是您对代币的信任。这个令牌可以被盗,即使上面有 TTL。您可以做几件事,对每个请求进行身份验证或将令牌映射到 IP 和端口(也称为连接)。这样就不会被盗了。如果这变得太难了,那么只需在每个请求中都需要凭据。

在对用户进行身份验证时,请确保将您的密码添加到数据库中。请查看如何在数据库中正确存储密码。

没有密码传给你。密码应该改为用于加密摘要。

另一件需要考虑的事情是消息认证。您的方法未实现 MAC(消息身份验证)。使用 MAC 可以确保消息未被篡改。虽然我同意篡改 SSL 消息很难,但您永远不知道您的客户端何时可能使用非 SSL,然后让网络设备为他们执行 SSL。因此,该消息可能在部分途中可见。

考虑到所有这些,这就是我的建议。

  1. 不要在请求中传递密码。
  2. 实施使用 SHA-256 等强加密的散列摘要。
  3. 要创建以下摘要哈希:用户名、密码、请求的某些部分(如果不是全部)和 NONCE(使用一次的数字)。
  4. 客户端可以自己生成 NONCE,如果他们这样做应该基于时间,比如时间戳,这样你就可以验证它是最近的 NONCE。或者您可以向他们发送您自己在 401 需要身份验证错误代码中生成的 NONCE。也许 NONCE 可以是您原来 post.
  5. 的令牌
  6. 对于每个请求,服务器都会对其进行散列并验证摘要值是否相同。

您会发现其他 Web 服务遵循与此类似但名称不同的内容。要点是这样的,不要在消息中传递密码,使用摘要进行消息和用户认证,使用NONCE使得摘要不能被窃取和重复使用。

login in REST web service

答案很简单,你不能做这样的事情,因为REST是无状态的。 REST 是关于机器对机器的通信,所以如果你不想支持第 3 方客户端,你很可能不需要 REST。 Ofc。您可以为自己的 ajax 客户端实现它,但在这种情况下它没有太大的好处,尤其是对于很少访问的站点。

在这种情况下,您必须使用 https 并在 header 中的每个请求中发送用户名和密码。你可以有一个用户名+密码的服务器端缓存 - >用户名+权限,这可以加强这一点。就这样。忘记令牌,只有第 3 方客户端需要它。