在设计 REST API 时,通常首先对用户进行身份验证吗?
我正在寻找的典型用例是:
- 用户想要获取数据。当然很酷,我们喜欢分享!获取公共(public) API key 并阅读!
- 用户想要存储/更新数据...哇等等!你是谁,你能做到吗?
我想构建一次并允许 Web 应用程序、Android 应用程序或 iPhone 应用程序使用它。
REST API 似乎是满足此类要求的合理选择
为了说明我的问题,我将使用一个简单的例子。
我的数据库中有一个项目,它具有评级属性(整数 1 到 5)。
如果我正确理解 REST,我将使用我选择的语言实现 GET 请求,返回 csv、xml 或 json,如下所示:
http://example.com/product/getrating/{id}/
假设我们选择返回的 JSON:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
这对于面向公众的 API 来说很好。我明白那部分了。
我有很多问题是如何将其与安全模型结合起来?我习惯了网络应用程序安全性,我有一个 session 状态可以随时识别我的用户,这样我就可以控制他们可以做什么,无论他们决定向我发送什么。据我了解,这不是 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 的无状态部分。
第二种方法对我来说似乎更好,但我想知道我真的需要重新发明这整个事情吗?散列、存储、生成 key 等全部由我自己完成吗?
这听起来很像在典型的 Web 应用程序中使用 session 并自己重写整个堆栈,这对我来说通常意味着“你做错了”,尤其是在处理安全性时。
编辑:我想我也应该提到 OAuth。
最佳答案
5年后编辑
使用 OAuth2!
先前版本
不,完全没有必要使用cookie。它的安全性还不及 HTTP Digest、OAuth 或 Amazon 的 AWS(这不难复制)。
您应该看待 cookie 的方式是,它与 Basic/Digest/OAuth/一样都是身份验证 token ,但不太合适。
但是,我不认为使用 cookie 本身就违反了 RESTful 原则,只要 session cookie 的内容不会影响您从服务器。
Cookie 是邪恶的,请停止使用它们。
关于web-services - 确保 REST API 安全,无需重新发明轮子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7238094/