我正在使用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
答案 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)