适用于iOS的安全API,无需用户帐户

我知道这是一个受欢迎的问题,但是我还没有find任何其他的问题来解决我的具体需求。

背景

  • 我有一个iOS应用程序,从我的Ruby on Rails开发的Web API中检索数据。
  • 我想私有化我的API,以便其他来源不能使用来自我的API的数据(即别人开发一个应用程序,打我的APIurl,并为他们的客户使用的数据)

要求

  • (HARD)私有API,以便只有经过授权的客户端(只能从iOS应用程序进入)才能访问API中的数据。
  • (HARD)用户不必创build用户/密码帐户。
  • (SOFT)我已经读过,试图获得苹果认可的应用程序时,SSL可能会变成一场噩梦。 由于这是一个小型应用程序(截至目前),我宁愿依靠SSL。 但是 ,如果您可以指出正确的方向,就可以轻松在iOS上使用所有APIstream量使用SSL,我完全可以接受)。

如果你失去了兴趣,跳到这个问题的结尾:)

迄今为止的想法

想法1:

  1. iOS从Web请求令牌,发送一些UUID
  2. WEB响应API_Token和Token_Expiry
  3. WEB存储数据库中的UUID,API_Token和Token_Expiry
  4. iOS在本地存储API_令牌Token_Expiry
  5. iOS通过发送UUID和API_Token来请求数据
  6. WEBvalidationUUID和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. WEBvalidationUUID和API_Token,用数据和NEW TOKEN响应
  7. iOS获取数据并在本地保存NEW TOKEN
  8. 无限重复步骤5-7

这些想法的问题

我相信,iOS不再有完美的UUID解决scheme。 如果UUID可能随时间变化(或者用户有多个iOS设备),则可能会发生身份validation问题。

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

你有什么build议在Rails和iOS之间创build一个安全的API?


编辑1:

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

除了跨设备跟踪用户的问题,我不知道如何提供一个合理简单和可靠的机制,而不是一个Game Center帐户,让我们来讨论一下closures你的API到其他应用程序的简单方法。

握手会涉及您的客户提交URL请求,该请求可能已经包含设备特定的令牌来识别您的用户。 来自服务器的响应将是一个stringforms的随机一次性挑战。 客户端和服务器都知道一个非平凡的函数,它根据挑战和可能的用户令牌生成响应string,从而validation客户端。

这个机制并不安全,实施起来微不足道,会给别人一些障碍。 您应该明确validation用户令牌的forms,以获得一些额外的保护。 例如,如果您的令牌是MAC地址,则请求必须具有MAC地址的forms。

根据我在网上find的一些build议,我结束了自己的解决scheme(请参阅最后的参考链接)。

  1. iOS会检查它是否有auth_token。 如果否,请继续步骤2,否则继续步骤4。
  2. iOS通过发送一个特殊的签名来请求一个auth_token,只有我的iOS应用和服务器知道如何生成。
  3. WEBvalidation特殊签名并创build一个唯一的auth_token,保存在数据库中并发送回iOS应用程序。
  4. iOS通过发送auth_token和一个生成的签名来请求数据(同样,只有我的iOS和服务器知道如何生成)。
  5. WEBvalidation数据库中是否存在auth_token。 然后它生成一个auth_signature,并validation请求来自我的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