web-services - 确保 REST API 安全,无需重新发明轮子

标签 web-services security rest

在设计 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/

相关文章:

c# - 正确处理用户信息,ASP.NET是怎么做到的?

security - 中间人能否拦截 SSL 数据包并复制它?

python - 学习python为了安全,遇到su的麻烦

java - Salesforce 批量 API 和 Apache Camel Salesforce 组件

javascript - ExtJS 4 - 访问 REST 代理和/或存储中的自定义响应 header ?

Java:从InvocationContext获取拦截器的注解参数

iphone - 如何在不同的iPhone上检测同一用户?

asp.net - 部署引用 Web 服务的 ASP.NET Web 服务

java - REST 中一些操作(动词)的命名约定

wcf - 具有 WCF Web 角色并通过 web.config 限制 IP 的 Windows Azure