2013-10-10 113 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