在设计REST API时,通常先对用户进行身份验证吗?
我正在寻找的典型用例是:
- 用户想要获取数据。当然,我们喜欢分享!获取公共API密钥并阅读!
- 用户想要存储/更新数据...等等!你是谁,你能做到吗?
我想一次构建它,并允许说一个Web应用程序,一个Android应用程序或一个iPhone应用程序来使用它。
REST API似乎是符合此类要求的合理选择
为了说明我的问题,我将使用一个简单的示例。
我在数据库中有一个项目,该项目具有等级属性(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很好。我明白了。
我有很多问题要问,如何将其与安全模型结合起来?我习惯了Web应用程序安全性,在该状态下,我始终具有标识用户的会话状态,因此无论他们决定发送给我什么,我都可以控制他们可以做什么。据我了解,这不是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应用程序中使用会话并自己重写整个堆栈,这对我来说通常意味着“您做错了”,尤其是在处理安全性时。
编辑:我想我也应该提到OAuth。