无法从Rake任务进行API调用

时间:2013-10-10 11:23:40

标签: ruby-on-rails ruby ruby-on-rails-3 api

我正在侦听端口4000上的Rails应用程序App2和侦听端口3000的另一个Rails应用程序App1App2定义了可以使用的自定义API调用,只能通过经过身份验证的用户。

App1上运行rake任务,该任务使用 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令牌。

2 个答案:

答案 0 :(得分: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令牌警告不会导致问题!我得到了一个我通过身份验证的回复。

答案 1 :(得分:0)

CSRF令牌用于网站用户的安全性。它被注入到每个表单中,仅对用户会话有效,浏览器必须通过每个帖子发送它以验证会话未被劫持。

如果你有一个不需要这种安全机制的专用api,你可以通过跳过protect_from_forgery检查来禁用应用程序中的CSRF令牌验证。