ruby on rails 3 -为未经身份验证的iPhone应用提供自定义令牌



我目前正在为iphone应用程序构建一个Rails后端。iphone访问特殊控制器,该控制器返回iphone应用程序解析并适当显示的JSON。Rails应用程序确实有一个管理面板,用于为iphone应用程序插入新数据。该身份验证由设计控制。除此之外,不需要复杂的身份验证,因为iphone应用程序不需要任何用户信息即可运行。

这就是我被卡住的地方。我已经添加了一个控制器,用户可以从应用程序提交反馈。反馈将被存储在铁路的数据库。为了做到这一点,我已经关闭了protect_from_forgery通过使用skip_before_filter :verify_authenticity_token, :only => [ :create ]控制器方法。但是,我知道这样做会产生安全问题。我也明白,我必须根据这个答案和这个答案创建自定义保护(例如令牌)。我的网页搜索只找到了如何使用设计或通过Oauth来做到这一点,但正如我提到的,iphone没有用户身份验证。我只想填补这个安全漏洞,除非我遗漏了什么。我很难找到任何关于这种特殊情况的文章。

默认情况下,启用:protect_from_forgery的Rails应用程序在关于页面的<meta>信息中包含一个真实性令牌,如下所示:

<meta content="arBBP614zvMxug9+5ozHakrXhAaTNmQ9aBJ/Ehp3nl8=" name="csrf-token">

您需要做的是下载表单的一个普通的旧html副本,并打开:protect_from_forgery,这样就生成了这个标记。然后,一旦你在NSString*中有了HTML,你可以找到这样的标记:

    NSArray* firstArray = [htmlString componentsSeparatedByString:@"" name="csrf-token">"];
    NSArray* secondArray = [[firstArray objectAtIndex:0] componentsSeparatedByString:@"<meta content=""];
    NSString* authToken = [secondArray objectAtIndex:1];

那么你只需要发送authToken作为X-CSRF-Token报头字段。这些通常不会经常更改,因此您可以保留一份副本一段时间。

最后我选择了一个标记。我设置控制器以使用before_filter检查令牌。然后用SSL把它锁起来。

before_filter :has_token?, only: :create
skip_before_filter :authenticate_user!, :verify_authenticity_token, only: :create

下面是我用来检查令牌的方法:

def has_token?
  if request.request_parameters[:token] == "SECRET"
    true
  else
    head :unauthorized
  end
end

然后令牌被硬编码到iPhone应用程序中,并与它发送到Rails后端的参数一起传递。我知道这意味着如果令牌必须更改,我必须发布iPhone应用的新版本,但这样我就可以更好地控制发生的事情。

相关内容

  • 没有找到相关文章

最新更新