api - 当还需要一次性密码时,我使用什么 HTTP 方法来检索信息?
问题描述
我已经对此进行了一些研究,但是对于这种特殊情况,我还没有找到可靠的答案。
假设我有一个名为的路由/information
,它返回指定的一些敏感数据,info_id
并且只有在提供有效的one_time_code
.
我可以考虑通过两种方式做到这一点:
- 获取/信息?info_id=x&one_time_code=y
- POST /信息
正文:info_id = x, one_time_code = y
响应(这不会改变,数据库中的任何其他内容也不会改变 - 一次性代码有过期 - 并且可以通过不同的方式清除):
{
"info_owner_id" : "1234",
...
}
根据我的理解,GET 方法似乎是更 RESTful 的方法,但可能并不理想,因为带有查询字符串的 URL 会保存在浏览器中,并且结果可能会一路缓存。此外,info_id
可能会在此过程中泄漏(即使在 URL 中使用 HTTPS)。
但是,使用 POST 方法,不会缓存任何内容,过期代码也不会保存在浏览器中。但是,没有创建任何内容,事实上,数据库根本没有更改,因此它可能不是最“合乎逻辑”的方法。
我正在努力理解在这种情况下的最佳做法是什么,我希望得到一些澄清。
此外,如果您认为完全不同的方式更可取,请告诉我。我正在考虑将 GET 与身份验证标头一起使用,但我的网站在其数据库中没有“用户”,但人们可以保存自己的信息并通过生成的链接访问它(info_id / 通过电子邮件发送的一次代码)。
解决方案
如果一次性代码泄漏,是否有问题,因为它只能使用一次?我的意思是,即使你在 url 上发送它,也会检索到响应,如果黑客想要重用它,它就行不通了……
在我看来,最 RESTful 的方式是:
GET /information/{infoId}?oneTimeCode=xxx
或者
GET /information/{infoId}/{oneTimeCode}
但它并不是真正的 RESTful,因为它不是无状态的,前提是您不能使用相同的 url 访问相同的资源两次。