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

时间:2013-01-22 05:30:48

标签: ios objective-c ruby-on-rails api

我知道这是一种流行的问题,但我找不到任何其他问题来解决我的具体需求。

背景

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

要求

  • (HARD)私有API,以便只有授权客户端(仅来自iOS应用程序)才能访问API中的数据。
  • (HARD)用户不必创建用户/密码帐户。
  • (SOFT)我读过,在尝试获得Apple批准的应用时,SSL可能会成为一场噩梦。由于这是一个小型应用程序(截至目前),我更喜欢依赖SSL。 但是,如果您可以指出我在iOS上使用SSL与所有API流量的轻松的正确方向,我很满意。

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

迄今为止的想法

创意1:

  1. iOS从网络请求令牌,发送一些UUID
  2. WEB以API_Token和Token_Expiry
  3. 响应
  4. WEB在数据库中存储UUID,API_Token和Token_Expiry
  5. iOS存储API_Token,本地Token_Expiry
  6. iOS通过发送UUID和API_Token
  7. 来请求数据
  8. WEB验证UUID和API_Token,使用数据进行响应
  9. 重复步骤5-6直到API_Token到期,然后从步骤1重复
  10. *创意2 :(一次性使用API​​_Token)*

    1. iOS从网络请求令牌,发送一些UUID
    2. WEB以API_Token回复
    3. WEB在数据库中存储UUID和API_Token
    4. iOS在本地存储API_Token
    5. iOS通过发送UUID和API_Token
    6. 来请求数据
    7. WEB验证UUID和API_Token,使用数据和NEW TOKEN进行响应
    8. iOS获取数据并在本地保存NEW TOKEN
    9. 无限期重复步骤5-7
    10. 这些想法的问题

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

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

      问题

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


      编辑1:

      我仍然感到惊讶,这不是一直出现的事情。必须有大量的应用程序与API通信但不强制用户注册。如果SSL或OAuth是唯一的正确的解决方案,请进行辩护。我听见了。

2 个答案:

答案 0 :(得分:2)

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

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

该机制绝不安全,但实施起来微不足道,并将为其他机制提供一些障碍。您绝对应该验证用户令牌的形式以获得一些额外的保护。例如,如果您的令牌是MAC地址,则请求必须具有MAC地址的形式。

答案 1 :(得分:1)

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

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

    @keighl的这个GitHub Gist是让我失望的原因,是迄今为止我找到的最好的例子: https://gist.github.com/4336694

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