首页 > 解决方案 > 当还需要一次性密码时,我使用什么 HTTP 方法来检索信息?

问题描述

我已经对此进行了一些研究,但是对于这种特殊情况,我还没有找到可靠的答案。

假设我有一个名为的路由/information,它返回指定的一些敏感数据,info_id并且只有在提供有效的one_time_code.

我可以考虑通过两种方式做到这一点:

  1. 获取/信息?info_id=x&one_time_code=y
  2. POST /信息
    正文:info_id = x, one_time_code = y

响应(这不会改变,数据库中的任何其他内容也不会改变 - 一次性代码有过期 - 并且可以通过不同的方式清除):

{
    "info_owner_id" : "1234",
    ...
}

根据我的理解,GET 方法似乎是更 RESTful 的方法,但可能并不理想,因为带有查询字符串的 URL 会保存在浏览器中,并且结果可能会一路缓存。此外,info_id可能会在此过程中泄漏(即使在 URL 中使用 HTTPS)。

但是,使用 POST 方法,不会缓存任何内容,过期代码也不会保存在浏览器中。但是,没有创建任何内容,事实上,数据库根本没有更改,因此它可能不是最“合乎逻辑”的方法。

我正在努力理解在这种情况下的最佳做法是什么,我希望得到一些澄清。

此外,如果您认为完全不同的方式更可取,请告诉我。我正在考虑将 GET 与身份验证标头一起使用,但我的网站在其数据库中没有“用户”,但人们可以保存自己的信息并通过生成的链接访问它(info_id / 通过电子邮件发送的一次代码)。

标签: apiresthttp

解决方案


如果一次性代码泄漏,是否有问题,因为它只能使用一次?我的意思是,即使你在 url 上发送它,也会检索到响应,如果黑客想要重用它,它就行不通了……

在我看来,最 RESTful 的方式是:

GET /information/{infoId}?oneTimeCode=xxx

或者

GET /information/{infoId}/{oneTimeCode}

但它并不是真正的 RESTful,因为它不是无状态的,前提是您不能使用相同的 url 访问相同的资源两次。


推荐阅读