当需要一次性密码时,我使用什么HTTP方法来检索信息?



我对此做了一些研究,但我还没有找到一个可靠的答案。

假设我有一个名为/information的路由,只有在提供了有效的one_time_code的情况下,它才返回指定info_id的一些敏感数据。

我认为有两种方法可以做到这一点:

  1. /信息? info_id = x& one_time_code = y
  2. POST/information
    body:info_id= x,one_time_code= y

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

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

从我的理解来看,GET方法似乎是更RESTful的方法,但可能不是理想的,因为带有查询字符串的URL将保存在浏览器中,也许结果将在此过程中被缓存。此外,info_id可能在此过程中泄漏(即使在URL中使用HTTPS)。

但是,使用POST方法,不会缓存任何内容,过期代码也不会保存在浏览器中。然而,没有创建任何东西,事实上,数据库根本没有改变,所以它可能不是最"合乎逻辑"的方法。

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

此外,如果你认为一个完全不同的方式是更好的,请让我知道。我想使用GET认证头,但我的网站没有'用户'在其数据库中,但人们可以保存自己的信息,并获得访问它与生成的链接(info_id/一次代码通过电子邮件发送)。

RESTful API经常使用(读),POST(创建)、PUT(替换/更新)和删除(删除记录)。

对于你的例子,人们经常使用get方法。

/信息/{infoId}

对于敏感信息,我强烈建议我们无论如何都要隐藏起来,让用户看不到。

所以在我看来,如果你使用get方法,我们应该把一次性令牌代码放在header中,或者如果你使用post方法,把它放在body中。

即使使用https, get或post都是安全的。我还是想把它藏起来,不让用户看到。

无状态是理想的,但当系统非常复杂时,很难达到认证,超时,一次性令牌,....

如果一次代码泄漏,这是一个问题,因为它只可以使用一次?我的意思是,即使你通过url发送,响应也会被检索到,如果黑客想重用它,这是行不通的…

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

GET /information/{infoId}?oneTimeCode=xxx

GET /information/{infoId}/{oneTimeCode}

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

我将使用GET请求。即使请求缓存在浏览器历史记录中(我使用XHR/ajax),获得一次性代码也不是破坏性的操作,也不会有真正的危险。正如您所提到的,由于没有更改任何内容,因此应该使用GET请求。注:所有GET查询参数都和POST主体使用SSL时一样安全。

最新更新