在设计 REST API 时,首先对用户进行身份验证是否常见?
我正在寻找的典型用例是:
我想建立它一次,并允许说,一个网络应用程序,安卓应用程序或 iPhone 应用程序使用它。
对于这样的需求,RESTAPI 似乎是一个合乎逻辑的选择
为了说明我的问题,我将用一个简单的例子。
我在数据库中有一个项目,它有一个 收视率属性(整数1到5)。
如果我正确理解 REST,我将使用我选择的返回 csv、 xml 或 json 的语言来实现 GET 请求,如下所示:
http://example.com/product/getrating/{id}/
假设我们选择 JSON,我们返回:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
这对于面向公众的 API 来说是很好的,我明白这一点。
我有很多问题,那就是如何将其与安全模型结合起来?我习惯了网络应用的安全性,在这里我有一个会话状态,可以随时识别我的用户,这样我就可以控制他们可以做什么,不管他们决定发送给我什么。据我所知,这不是 RESTful,所以在这种情况下是一个糟糕的解决方案。
我将尝试使用另一个使用相同项目/评级的示例。
如果用户“ JOE”希望向 项目添加 收视率
这可以通过以下方法实现:
http://example.com/product/addrating/{id}/{givenRating}/
此时,我希望存储这样的数据: “ JOE”给产品{ id }打分为{ givenRating }。
问: 我如何知道请求来自“ JOE”而不是“ BOB”。
此外,如果它是为了获得更合理的数据,比如用户的电话号码,又会怎样呢?
到目前为止,我得出的结论是:
1)使用 HTTP 的内置特性对每个请求进行身份验证,无论是纯 HTTP 还是 HTTPS。
这意味着现在每个请求都采取以下形式:
https://joe:joepassword@example.com/product/addrating/{id}/{givenRating}/
2)使用私钥和公钥的方法,比如 Amazon 的 S3: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3)无论如何使用 cookie 并破坏 REST 的无状态部分。
第二种方法对我来说似乎更好,但我留下的疑问是,我真的必须重新发明这整个东西吗?哈希,存储,生成的密钥,等所有自己?
这听起来很像在一个典型的 Web 应用程序中使用 session,然后自己重写整个栈,对我来说,这通常意味着“你做错了”,尤其是在处理安全性问题时。
编辑: 我想我也应该提到 OAuth。