2013-10-10 111 views
1

我有一個Rails應用程序App2偵聽端口4000的API調用和另一個Rails應用程序App1偵聽端口3000 App2有定義的自定義API調用只能由經過認證的用戶進行使用, 。無法使從Rake任務

rake任務是在App1跑,它使用HTTParty使API請求爲:

response = HTTParty.post("http://localhost:4000/users/sign_in", 
    :basic_auth => {:user => {:email => "<User email>", :password => "<Password>"}}, 
    :headers => { 'X-Requested-With' => 'XMLHttpRequest', 
     'User-Agent' => 'Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5', 
     'ContentType' => 'application/json' }) 

response.body輸出顯示的用戶沒有通過驗證!

在分析錯誤,開發日誌顯示:

WARNING: Can't verify CSRF token authenticity 

請幫我如何從Rake任務POST請求發送CSRF令牌。

回答

1

我在使用HTTParty的POST請求中犯了一個錯誤。 basic_auth應該是body。所以正確的說法是:

response = HTTParty.post("http://localhost:4000/users/sign_in", 
    :body => {:user => {:email => "<User email>", :password => "<Password>"}}, 
    :headers => { 'X-Requested-With' => 'XMLHttpRequest', 
    'User-Agent' => 'Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a Safari/6533.18.5', 
    'ContentType' => 'application/json' }) 

CSRF令牌警告不會導致問題!我得到了一個認證的回覆。

0

CSRF令牌用於您的網站用戶的安全。它被注入到每個表單中,只對用戶會話有效,並且瀏覽器必須將其發送給每個帖子以驗證會話未被劫持。

如果您有一個不需要此安全機制的專用api,則可以通過跳過protect_from_forgery檢查來禁用應用程序中的CSRF令牌驗證。

+0

有沒有什麼辦法讓我可以跳過基於我在rake任務請求傳遞參數的'protect_from_forgery'檢查? – SriramK89

+0

看看'skip_before_action:verify_authenticity_token'和你可以用來配置它的參數 – phoet