1

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

运行一个 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 令牌。

4

2 回答 2

1

我在 POST 请求中使用HTTParty. 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 令牌警告不会导致问题!我收到了我已通过身份验证的回复。

于 2013-10-16T15:26:09.017 回答
0

CSRF 令牌用于保护您的网站用户。它被注入到每个表单中,仅对用户会话有效,浏览器必须将其与每个帖子一起发送,以验证会话没有被劫持。

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

于 2013-10-10T11:53:15.540 回答