我正在侦听端口4000上的Rails应用程序App2
和侦听端口3000的另一个Rails应用程序App1
。App2
定义了可以使用的自定义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令牌。
答案 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令牌验证。