我确信您会适应用户登录以及通过SSL进行的通信,因此,我将重点介绍我认为这是问题中最有趣的部分:如何确保只读操作-这根本不要求用户进行身份验证-只能从自己的客户端应用程序接受?
首先,fNek在较早的答案中指出了一个缺点-您的客户端应用程序可能会受到潜在敌对用户的控制。可以检查它们,检查它们的通信,反汇编其代码。我要提出的任何建议都不能保证您不会有人对您的客户端进行反向工程并滥用您的REST API。但这应该在任何随意尝试之前设置障碍。
无论如何,一种常见的方法是:
- 客户端包含一个秘密
- 发出请求时,它将请求参数与密码连接起来,并对结果进行哈希处理
- 该哈希与请求一起发送,并由服务器检查
例如,想象一个GET
请求/products/widgets
假设客户机密是“ OH_HAI_I_IZ_SECRET”
连接HTTP动词,URL和密码:
GET/products/widgetsOH_HAI_I_IZ_SECRET
并采用SHA-1哈希值:
4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
然后将其发送,因此请求将用于:
GET /products/widgets?hash=4156023ce06aff06777bef3ecaf6d7fdb6ca4e02
最后,为防止某人至少重播单个请求,请同时添加一个时间戳,并将其添加到参数和哈希中。例如,在Unix时间,现在是1384987891。将其添加到串联中:
GET/products/widgetsOH_HAI_I_IZ_SECRET1384987891
哈希:
2774561d4e9eb37994d6d71e4f396b85af6cacd1
并且寄出:
GET /products/widgets?time=1384987891&hash=2774561d4e9eb37994d6d71e4f396b85af6cacd1
服务器将检查哈希值,并还验证时间戳记是否为最新时间戳(例如,在5分钟内允许时钟不完全同步)。
警告!由于您在谈论移动应用程序,因此肯定存在某人的手机时钟错误的风险。或时区错误。或者其他的东西。将时间添加到哈希中可能会破坏一些合法用户,因此请谨慎使用该想法。