2013-01-15 72 views
1

我目前正在爲iphone應用程序構建Rails後端。 iPhone訪問特殊的控制器,返回iphone應用程序解析並適當顯示的JSON。 Rails應用程序確實有一個管理面板,用於爲iphone應用程序插入新數據。該認證由Devise控制。除此之外,由於iphone應用程序不需要任何用戶信息來運行,因此不需要進行復雜的身份驗證。爲未經認證的iPhone應用程序提供自定義令牌

這裏是我卡住的地方。我已經添加了一個控制器,用戶可以從應用程序提交反饋。該反饋將存儲在Rail的數據庫中。爲了做到這一點,我已經通過使用該控制器方法的skip_before_filter :verify_authenticity_token, :only => [ :create ]來關閉protect_from_forgery。但是通過這樣做,我明白這會造成安全問題。我也明白我必須按照this answerthis answer創建自定義保護(例如令牌)。我的網絡搜索只發現如何使用設計或通過Oauth做到這一點,但正如我所提到的,沒有用戶認證的iPhone。我想要做的就是把這個安全漏洞隔開,除非我失去了一些東西。我很難找到關於這個特定情況的任何文章。

回答

0

默認情況下,導軌和:protect_from_forgery上的應用程序包括在<meta>信息的真實性令牌有關網頁,就像這樣:

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

你需要做的就是下載表單的一個普通的老HTML複製什麼,與:protect_from_forgery,因此這個標籤生成。然後,一旦你有一個HTML的NSString*你可以找到令牌就像這樣:

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

然後你只需要發送authToken作爲X-CSRF-Token頭字段。這些通常不會經常改變,所以你可以保留一段時間的副本。

+0

非常有趣!我喜歡它,因爲它很簡單。我也很好奇存在哪些其他解決方案,但我將在此期間玩這個。 – pacothelovetaco

+0

我最終走了另一條路線,儘管我喜歡你的答案,而且這是一個解決方案,我打算將它標記爲答案。 – pacothelovetaco

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應用程序的新版本,但這樣我可以更好地控制正在發生的事情。

相關問題