我正在构建一个与 Ruby on Rails 后端对话的 iPhone 应用程序。 Ruby on Rails 应用程序还将为 Web 用户提供服务。 restful_authentication 插件是提供快速和可定制的用户身份验证的绝佳方式。但是,我希望 iPhone 应用程序的用户在新列中存储一个由手机的唯一标识符 ([[UIDevice device] uniqueIdentifier]) 自动创建的帐户。稍后,当用户准备好创建用户名/密码时,帐户将更新为包含用户名和密码,iPhone 唯一标识符保持不变。用户在设置用户名/密码之前不能访问该网站。然而,他们可以使用 iPhone 应用程序,因为该应用程序可以使用它的标识符对自己进行身份验证。
修改 restful_authentication 以执行此操作的最佳方法是什么?创建插件?还是修改生成的代码?
其他框架怎么样,例如 AuthLogic。让 iPhone 将生成的身份验证 token 锁定到其 UUID,然后让用户稍后创建用户名/密码的最佳方法是什么?
最佳答案
我认为您不应该单独使用手机标识符进行身份验证,因为它不是 secret ,而且可能也是可猜测/可预测的。不要忘记,如果有人想破解您的网络应用程序,他们不必使用您的代码 - 他们只需猜测设备 ID 并尝试使用任何网络客户端篡改您的用户数据。
您应该将设备 ID 视为类似于用户名 - 它用于识别而非身份验证。我建议您让用户选择一个密码,或者更好地自动生成一个随机代码,以配合它 - 然后发送设备 ID +此密码/代码首先注册设备,然后对设备进行身份验证。
您还可以打赌,某些用户将拥有不止一台设备 - 或者他们最终会更换一台,或者您会遇到像 Stephen Fry 这样使用 4 部 iPhone 的人。为了解决这个问题,我建议你寻找一种方法来实例化 restful_authentication 两次,一次用于验证用户,第二次用于验证设备。我没有使用过这个插件,但我希望你只需要使用不同的表参数来实现这一点。然后在您的应用程序逻辑中允许用户将多个设备与其帐户相关联。
要安全地做到这一点,要么从设备上执行此操作,要么让设备显示一个随机代码,然后他们将其输入网络应用程序以证明他们拥有该设备(这听起来比实际更痛苦 - 这是相同的过程苹果在 iTunes、Apple TV 和远程应用程序中使用的 - 看看他们是如何做到的 - 所以这对用户来说不会那么令人惊讶)。
(还要确保在生成任何随 secret 码时,您使用加密随机数生成器作为基础 - 可能有一个 iPhone API 用于此 - 否则您的密码可能是可预测的)。
关于iphone - 扩展 restful_authentication/AuthLogic 以支持匿名 iPhone 的延迟登录的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/351627/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象