【发布时间】:2011-11-06 11:24:47
【问题描述】:
在设计 REST API 时,通常首先对用户进行身份验证吗?
我正在寻找的典型用例是:
- 用户想要获取数据。当然很酷,我们喜欢分享!获取公共 API 密钥并读取!
- 用户想要存储/更新数据...哇等等!你是谁,你能做到吗?
我想构建一次并允许网络应用、Android 应用或 iPhone 应用使用它。
REST API 似乎是符合此类要求的合乎逻辑的选择
为了说明我的问题,我将使用一个简单的例子。
我在数据库中有一个项目,它有一个 rating 属性(整数 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”想要为 item
添加 rating这可以使用:
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 应用程序中使用会话并自己重写整个堆栈,这对我来说通常意味着“你做错了”,尤其是在处理安全问题时。
编辑:我想我也应该提到 OAuth。
【问题讨论】:
-
如果您在每次请求时都发送用户名和密码,请使用 HTTPS。
-
与安全无关,但 RESTful API 不会使用
getrating和andrating;它只是rating,您可以 GET、POST、PUT 或 DELETE 到该资源。
标签: web-services security rest