使用Rails

时间:2015-06-02 06:25:01

标签: ruby-on-rails mechanize csrf

我正在使用mechanize(ruby)编写一些脚本来测试我的网站,当我向登录页面发出get请求时,我得到的html包含不同的登录表单中的CSRF令牌来自存储在rails会话中的CSRF,因此在提交包含登录数据的帖子请求时,会生成错误无法验证CSRF令牌真实性,我无法登录。从浏览器正常登录时不会发生这种情况,所以有什么想法吗?

注意:使用mechanize获取登录页面时返回CSRF,始终与我今天和昨天的所有测试具有相同的值!我不知道这是否有用。

我的代码:

agent = Mechanize.new
page = agent.get('http://localhost:3000')
form = page.forms.last
form['user[email]'] = 'my email'
form['user[password]'] = 'password'
form.submit

2 个答案:

答案 0 :(得分:0)

之前我遇到过这个问题,我在不同的Q和A网站上询问过但没有得到有用的答案。

我找到的唯一解决方案:

skip_before_filter :verify_authenticity_token

它将跳过CSRF验证我认为它对测试环境有利,肯定不会用于生产。 我希望找到其他解决方案。

答案 1 :(得分:0)

好吧,我知道这个话题已经很老了,但我偶然发现了这个问题,我自己也需要一个有效的解决方案,我们走了:

请先设置您的凭据并启动本地服务器,然后运行该脚本。

require 'mechanize'
require 'nokogiri'
require 'open-uri'

# set global login credentials
$email = "email@emailprovider.com"
$password = "your-password"

# generate a mechanize agent object for persistent "browsing"
a = Mechanize.new { |agent| agent.user_agent_alias = 'Mac Safari' }

def form_login(a)
  # get the desired page with the login form
  a.get('http://localhost:3000/users/sign_in') do |page|

    # search the current csrf-token in the head of the document
    csrf_token = page.search('//meta[@name="csrf-token"]/@content')

    # now let's dive into the form, that asks for email, password
    # and for the authenticity_token in a hidden field
    login_result = page.form_with(:id => 'new_user') do |login|

      login.field_with(:name => 'user[email]').value = $email
      login.field_with(:name => 'user[password]').value = $password
      login.field_with(:name => 'authenticity_token').value = csrf_token

      # check output in console
      puts login.values

      # submit the form
      login.submit
    end # of login block
  end
end


form_login(a)