3

我知道这是一种流行的问题类型,但我找不到任何其他可以满足我特定需求的问题。

背景

  • 我有一个 iOS 应用程序,可以从我的 Ruby on Rails 开发的 Web API 中检索数据。
  • 我想将我的 API 私有化,以便其他来源无法使用来自我的 API 的数据(即,其他人开发了一个应用程序来访问我的 API url 并将数据用于他们的客户)

要求

  • (硬)私有 API,以便只有授权客户端(仅来自 iOS 应用程序)才能访问来自 API 的数据。
  • (困难)用户不必创建用户/密码帐户。
  • (软)我读到 SSL 在尝试获得 Apple 批准的应用程序时可能会成为一场噩梦。由于这是一个小型应用程序(截至目前),我宁愿依赖 SSL。 但是,如果您能指出我在iOS 上轻松使用 SSL 处理所有 API 流量的正确方向,我会全力以赴)。

如果您失去兴趣,请跳到问题的最后 :)

到目前为止的想法

想法1:

  1. iOS 从 Web 请求令牌,发送一些 UUID
  2. WEB 响应 API_Token 和 Token_Expiry
  3. WEB在数据库中存储UUID、API_Token和Token_Expiry
  4. iOS在本地存储API_Token、Token_Expiry
  5. iOS 通过发送 UUID 和 API_Token 请求数据
  6. WEB验证UUID和API_Token,用数据响应
  7. 重复步骤 5-6 直到 API_Token 过期,然后从步骤 1 开始重复

*想法2:(单次使用API​​_Token)*

  1. iOS 从 Web 请求令牌,发送一些 UUID
  2. WEB 响应 API_Token
  3. WEB在数据库中存储UUID和API_Token
  4. iOS 在本地存储 API_Token
  5. iOS 通过发送 UUID 和 API_Token 请求数据
  6. WEB 验证 UUID 和 API_Token,以数据和 NEW TOKEN 响应
  7. iOS 获取数据并在本地保存 NEW TOKEN
  8. 无限期重复步骤 5-7

这些想法的问题

我相信 iOS 不再有完美的 UUID 解决方案。如果 UUID 可以随时间变化(或者如果用户有多个 iOS 设备),则可能会出现身份验证问题。

如果黑客获得了 API 密钥,我不希望他们能够访问数据(因此产生了过期或新令牌的想法)。

问题

您对在 Rails 和 iOS 之间创建安全 API 有什么建议?


编辑1:

我仍然很惊讶这不是一直出现的事情。必须有大量的应用程序与 API 通信,但不强制用户注册。如果 SSL 或 OAuth 是唯一合适的解决方案,请辩护。我全是耳朵。

4

2 回答 2

2

除了跨设备跟踪用户的问题,我不知道如何提供一个相当简单和可靠的机制,除了一个游戏中心帐户,让我们讨论一种将你的 API 关闭到其他应用程序的简单方法。

握手将涉及您的客户端提交一个 URL 请求,该请求可能已经包含一个特定于设备的令牌来识别您的用户。来自您的服务器的响应将是字符串形式的随机一次性质询。客户端和服务器都知道一个重要的函数,它生成一个响应字符串作为挑战的函数,可能还有用户令牌,从而验证客户端。

该机制绝不是安全的,但实施起来很简单,并且会给其他人提供一些障碍。您绝对应该验证用户令牌的形式以获得一些额外的保护。例如,如果您的令牌是 MAC 地址,则请求必须采用 MAC 地址的形式。

于 2013-01-22T18:02:06.533 回答
1

我最终根据在网上找到的一些建议推出了自己的解决方案(请参阅最后的参考链接)。

  1. iOS 检查它是否有 auth_token。如果否,则进行第 2 步,否则进行第 4 步。
  2. iOS 通过发送只有我的 iOS 应用程序和服务器知道如何生成的特殊签名来请求 auth_token。
  3. WEB 验证特殊签名并创建一个唯一的 auth_token 保存在数据库中并发送回 iOS 应用程序。
  4. iOS 通过发送 auth_token 和生成的签名(同样只有我的 iOS 和服务器知道如何生成)来请求数据。
  5. WEB 验证数据库中是否存在 auth_token。然后它会生成一个 auth_signature 并验证请求来自我的 iOS 应用程序。
  6. WEB 使用数据和新生成的 auth_token 进行响应。
  7. WEB 从数据库中删除以前的 auth_token。
  8. iOS 在本地保存新的 auth_token 并使用数据。
  9. 重复步骤4-8;如果响应是未经授权的 401,则在步骤 1 重新开始。

参考:

@keighl 的这个 GitHub Gist 让我开始了,迄今为止我发现的最好的例子: https ://gist.github.com/4336694

Railscast:保护 API: http ://railscasts.com/episodes/352-securing-an-api

于 2013-01-30T05:25:09.380 回答