无用户帐户的iOS安全API

无用户帐户的iOS安全API,ios,objective-c,ruby-on-rails,api,Ios,Objective C,Ruby On Rails,Api,我知道这是一个很受欢迎的问题,但我还没有找到任何其他能满足我具体需求的问题 背景 我有一个iOS应用程序,可以从RubyonRails开发的web API检索数据 我想将我的API私有化,以便其他来源不能使用来自我的API的数据(即,其他人开发了一个点击我的API url并为其客户使用数据的应用程序) 要求 (硬)专用API,以便只有授权客户端(仅来自iOS应用程序)才能从API访问数据 (硬)用户不得创建用户/密码帐户 (软)我读到,当试图让应用程序获得苹果的批准时,SSL可能会成为一场

我知道这是一个很受欢迎的问题,但我还没有找到任何其他能满足我具体需求的问题

背景
  • 我有一个iOS应用程序,可以从RubyonRails开发的web API检索数据
  • 我想将我的API私有化,以便其他来源不能使用来自我的API的数据(即,其他人开发了一个点击我的API url并为其客户使用数据的应用程序)
要求
  • (硬)专用API,以便只有授权客户端(仅来自iOS应用程序)才能从API访问数据
  • (硬)用户不得创建用户/密码帐户
  • (软)我读到,当试图让应用程序获得苹果的批准时,SSL可能会成为一场噩梦。由于这是一个小时间应用程序(到目前为止),我宁愿不依赖SSL但是,如果您能为我指出在iOS上所有API流量中使用SSL的方便性的正确方向,我洗耳恭听)
!如果您对问题失去兴趣,请跳到问题的结尾:)

迄今为止的想法 想法1:

  • iOS从web请求令牌,发送一些UUID
  • WEB使用API_令牌和令牌_到期进行响应
  • WEB在数据库中存储UUID、API_令牌和令牌_到期
  • iOS在本地存储API_令牌、令牌_到期
  • iOS通过发送UUID和API_令牌请求数据
  • WEB验证UUID和API_令牌,用数据响应
  • 重复步骤5-6,直到API_令牌过期,然后从步骤1开始重复
  • *想法2:(一次性使用API_令牌)*

  • iOS从web请求令牌,发送一些UUID
  • WEB使用API_令牌进行响应
  • WEB在数据库中存储UUID和API_令牌
  • iOS在本地存储API_令牌
  • iOS通过发送UUID和API_令牌请求数据
  • WEB验证UUID和API_令牌,用数据和新令牌响应
  • iOS获取数据并在本地保存新令牌
  • 无限期重复步骤5-7
  • 这些想法的问题 我相信iOS再也没有完美的UUID解决方案了。如果UUID可以随时间变化(或者如果用户有多个iOS设备),则可能发生身份验证问题

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

    问题: 对于在Rails和iOS之间创建一个安全的API,您有什么建议


    编辑1:


    我仍然很惊讶这不是经常出现的事情。一定有很多应用程序可以与API通信,但不会强迫用户注册。如果SSL或OAuth是唯一合适的解决方案,请进行辩护。我洗耳恭听。

    除了跨设备跟踪用户的问题之外,我不知道如何提供一个合理简单可靠的机制,而不是游戏中心帐户,让我们讨论一种简单的方法来关闭其他应用程序的API

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


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

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

  • iOS检查它是否有身份验证令牌。如果否,则转至步骤2,否则转至步骤4
  • iOS通过发送只有我的iOS应用程序和服务器知道如何生成的特殊签名来请求auth_令牌
  • WEB验证特殊签名并创建唯一的auth_令牌,该令牌保存在DB中并发送回iOS应用程序
  • iOS通过发送auth_令牌和生成的签名(同样,只有我的iOS和服务器知道如何生成签名)来请求数据
  • WEB验证数据库中是否存在auth_令牌。然后,它生成一个auth_签名,并验证请求是否来自我的iOS应用程序
  • WEB使用数据和新生成的auth_令牌进行响应
  • WEB从数据库中删除以前的身份验证令牌
  • iOS在本地保存新的身份验证令牌并使用数据
  • 重复步骤4-8;如果响应为401 unauthorized,请在步骤1重新启动
  • 参考资料: @keighl的GitHub Gist是我的出发点,也是我发现的最好的例子:

    Railscast:保护API:

    AFAIK,如果没有一些易出错的iCloud技巧,就无法跨设备跟踪用户,有些人可能会纠正我。至于保护API,请使用长令牌质询客户端,并让它返回由秘密函数生成的哈希。不完美,但可能足够好。@s.bandara因为我对以这种方式保护东西非常陌生,你能给我指出一个链接,我可以跟进或进一步解释吗?如果我挑战每个客户端(我的iOS应用程序),我是否需要这样做才能在1之前“打开通信线路”。请求数据,获取令牌,发送散列,然后获取数据(4次行程)?感谢您的评论和回答。我写了我自己的答案,但我感谢你加入讨论。每次我读到一些关于这个话题的东西,都会产生共鸣,并在某个地方被某种方式所使用。所以,非常感谢您的回答。如果您正在为每个请求生成一个新的auth_令牌,那么在我看来,您可以用一个简单的质询响应来替换所有这些步骤:1)iOS使用api请求发送生成的sig,2)服务器验证sig并发送api响应或拒绝访问。不那么凌乱。您概述流程的方式,如果有