为未经身份验证的iPhone应用程序提供自定义令牌

时间:2013-01-15 01:41:49

标签: iphone ruby-on-rails-3 json devise

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

这是我被困的地方。我添加了一个控制器,用户可以从应用程序提交反馈。该反馈将存储在Rail的数据库中。为此,我使用protect_from_forgery为该控制器方法关闭了skip_before_filter :verify_authenticity_token, :only => [ :create ]。但通过这样做,我明白这会产生安全问题。我也理解我必须按照this answerthis answer创建自定义保护(例如令牌)。我的网络搜索只发现了如何使用Devise或Oauth,但正如我所提到的,iphone没有用户身份验证。除了我遗漏的东西之外,我想要做的就是把这个安全漏洞搞定。我找不到任何关于这种特殊情况的文章。

2 个答案:

答案 0 :(得分:0)

默认情况下,: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标头字段发送。这些通常不会经常更改,因此您可以暂时保留一份副本。

答案 1 :(得分:0)

我最终拿出了我选择的代币。我设置控制器以使用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应用程序,但这样我可以更好地控制正在发生的事情。