扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是啥?
Posted
技术标签:
【中文标题】扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是啥?【英文标题】:What is the best way to extend restful_authentication/AuthLogic to support lazy logins by an anonymous iPhone?扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是什么? 【发布时间】:2010-09-25 23:35:06 【问题描述】:我正在构建一个与 Ruby on Rails 后端对话的 iPhone 应用程序。 Ruby on Rails 应用程序还将为 Web 用户提供服务。 restful_authentication 插件是提供快速和可定制的用户身份验证的绝佳方式。但是,我希望 iPhone 应用程序的用户在新列中存储一个由手机的唯一标识符 ([[UIDevice device] uniqueIdentifier]) 自动创建的帐户。稍后,当用户准备好创建用户名/密码时,帐户将更新为包含用户名和密码,iPhone 唯一标识符保持不变。用户在设置用户名/密码之前不能访问该网站。然而,他们可以使用 iPhone 应用程序,因为该应用程序可以使用它的标识符来验证自己。
修改 restful_authentication 以执行此操作的最佳方法是什么?创建插件?还是修改生成的代码?
其他框架怎么样,例如 AuthLogic。让 iPhone 将生成的身份验证令牌锁定到其 UUID,然后让用户稍后创建用户名/密码的最佳方法是什么?
【问题讨论】:
不是一个真正的答案,而是更多需要考虑的问题:您的设计如何处理某人拥有 iphone 帐户,在网站上独立注册用户/密码帐户,然后想要合并两个帐户? 我对这个问题做了一些进一步的思考,虽然我还没有想出一个让我满意的解决方案,但我已经尝试了一些东西。使用链接到设备对象的随机用户名/密码创建一个匿名帐户有些工作。但是,这要求设备在创建时获取用户名/密码并将其存储。此解决方案的问题在于,该站点充斥着匿名帐户贡献(通过在用户中设置名为匿名的帐户类型字段很容易修复,然后您可以在需要时将其过滤掉)。此解决方案有效,但效果不佳。 【参考方案1】:我认为您不应该单独使用手机标识符来进行身份验证,因为它不是秘密,而且可能也是可猜测/可预测的。不要忘记,如果有人想破解您的网络应用程序,他们不必使用您的代码 - 他们只需猜测设备 ID 并尝试使用任何网络客户端来篡改您的用户数据。
您应该将设备 ID 视为类似于用户名 - 它用于识别而非身份验证。我建议您让用户选择一个密码,或者更好地自动生成一个随机代码,以配合它 - 然后发送设备 ID +此密码/代码首先注册设备,然后对设备进行身份验证。
您也可以打赌,某些用户将拥有不止一台设备 - 或者他们最终会更换一台,或者您会遇到像 Stephen Fry 这样使用 4 部 iPhone 的人。为了解决这个问题,我建议你寻找一种方法来实例化 restful_authentication 两次,一次用于验证用户,第二次用于验证设备。我没有使用过这个插件,但我希望你只需要使用不同的表参数来实现这一点。然后在您的应用程序逻辑中允许用户将多个设备与其帐户相关联。
要安全地做到这一点,要么从设备上进行,要么让设备显示一个随机代码,然后他们将其输入网络应用程序以证明他们拥有该设备(这听起来比实际更痛苦 - 这是相同的过程苹果在 iTunes、Apple TV 和远程应用程序中使用的 - 看看他们是如何做到的 - 所以这对用户来说不会那么令人惊讶)。
(还要确保在生成任何随机密码时,您使用加密随机数生成器作为基础 - 可能有一个 iPhone API 用于此 - 否则您的密码可能是可预测的)。
【讨论】:
谢谢弗兰克斯。这是关于授权设备的安全方案的所有很好的建议。它并没有完全回答我关于修改 restful_authentication 的技术的问题。我认为你提出了一些很好的观点! 好吧,我真的建议您不要修改 restful_authentication - 重新考虑您的方案,以便您可以使用它的两个不同实例 - 一个用于验证设备,另一个用于识别用户。加上允许将 N 个设备绑定到用户的应用程序逻辑。 您有什么建议吗? frankodwyer:设备 UUID 是否比其他任何 API 密钥安全? API 密钥通常为 40 个字符或更长,设备 UUID 有多长? 我不记得长度,但它是那个顺序。然而,这并不是一个真正的秘密。例如,它适用于手机上运行的任何应用程序。当手机连接时,它也可以在 iTunes 中看到。人们在参与测试时将其分发给开发人员。并且可能有应用程序通过 wifi 以明文方式发送它。最后但并非最不重要的一点是,它无法更改 - 因此披露是一场灾难,无法恢复。【参考方案2】:您是否尝试过使用其他身份验证方案,例如 Authlogic?我发现 restful_authentication 相当麻烦(尽管我使用 bort 作弊)。
【讨论】:
是的,restful_authentication 似乎相当麻烦。我会看看 Authlogic,不过,我已经通过直接修改 restful_authentication 提出了一个临时替代方案(但这并不能证明它的未来升级)。【参考方案3】:在 Rails 中生成随机密码 link text 我正在为我的一个项目使用 Restful_authentication 插件。 作为我的用户创建工作流程的一部分,系统应该为新用户生成一个随机密码。
【讨论】:
【参考方案4】:您对使用 UDID 和使用 UDID + 站点范围定义的盐生成的随机密码有何看法?
类似:
salt = 'afG553Dvbf3'
udid = '1234567890'
pass = Digest::MD5.hexdigest(udid + salt)
并在下次连接时将该密码发送到 iPhone。
【讨论】:
以上是关于扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
从 restful_authentication 迁移到 Devise 时,我需要更改会话和用户控制器吗?
激活用户时带有acts_as_state_machine的restful_authentication中的DoubleRenderError