2015-06-02 9 views
0

Я пишу какой-то скрипт, использующий mechanize (ruby) для проверки моего сайта, когда я делаю запрос на вход на страницу входа, я получаю html, который включает токен CSRF в форме входа, которая разные из CSRF, хранящиеся в сеансе рельсов, поэтому при отправке запроса на отправку с данными входа генерируется ошибка Невозможно подтвердить подлинность CSRF-токена, и я не могу войти. Этого не происходит при регистрации в браузере в обычном режиме, поэтому любая мысль?Неверный токен CSRF, сгенерированный с помощью Rails

Примечание: 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

Я сталкивался с этой проблемой раньше, я спросил на различных Q и A сайты, но нет полезных ответов я не получил.

единственное решение, которое я нашел это:

skip_before_filter :verify_authenticity_token 

будет пропущена проверка CSRF Я думаю, что это будет хорошо для тестовой среды точно не для производства. Я хочу найти другое решение.

0

хорошо, я знаю, эта тема довольно старая, но я наткнулся на это и требуется рабочий раствор, себя и здесь мы идем:

установите учетные данные первого и запустить локальный сервер, а затем запустить скрипт.

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

# set global login credentials 
$email = "[email protected]" 
$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) 
Смежные вопросы