Передача куки с HTTParty - PullRequest
       12

Передача куки с HTTParty

0 голосов
/ 04 марта 2019

Я пытаюсь войти в систему с помощью HTTParty в приложение Rails.Идея состоит в том, чтобы отправить запрос POST и получить с ним файл cookie сеанса, затем отправить запрос GET с этим файлом cookie и войти в систему:

Запрос POST

HTTParty.post('url/login/', basic_auth: {user: 'user', password: 'password'}, follow_redirects: false)

возвращает

#<HTTParty::Response:0x7f9c71bc4598 parsed_response=nil, @response=#<Net::HTTPFound 302 302 readbody=true>, @headers={"date"=>["Mon, 04 Mar 2019 08:02:26 GMT"], "server"=>["Apache"], "strict-transport-security"=>["max-age=31536000"], "set-cookie"=>["JSESSIONID=6552C1F4FD12D1C5B1D3B42168B9588A.node2; Path=/; Secure; HttpOnly"], "x-content-type-options"=>["nosniff"], "x-xss-protection"=>["1; mode=block"], "cache-control"=>["no-cache, no-store, max-age=0, must-revalidate"], "pragma"=>["no-cache"], "expires"=>["0"], "location"=>["/ipad-api/v20/login/failure/"], "vary"=>["Accept-Encoding,User-Agent"], "content-length"=>["20"], "connection"=>["close"], "content-type"=>["text/plain; charset=UTF-8"]}>

Я отправляю запрос GET

HTTParty.get('url/login/success/', cookie: "6552C1F4FD12D1C5B1D3B42168B9588A.node2")

и получаю

#<HTTParty::Response:0x7f9c71b95950 parsed_response={"head"=>{"apikey"=>nil, "sessionid"=>"320E4C622043566D5424627BDE11997D.node3", "timestamp"=>1551686567666, "sessiontimeout"=>1551689267666, "wishlistItemsCount"=>0, "basketItemsCount"=>0, "loggedIn"=>false, "role"=>"G"}, "data"=>{"user"=>{"profile"=>{"title"=>nil, "firstname"=>nil, "lastname"=>nil, "street"=>nil, "street2"=>nil, "postalcode"=>nil, "city"=>nil, "customerID"=>nil, "customerType"=>0}}, "abandonedBasket"=>false}, "messages"=>[{"code"=>"bmd.api.login.success", "statusCode"=>200, "description"=>"OK"}]}, @response=#<Net::HTTPOK 200 200 readbody=true>, @headers={"date"=>["Mon, 04 Mar 2019 08:02:47 GMT"], "server"=>["Apache"], "strict-transport-security"=>["max-age=31536000"], "set-cookie"=>["JSESSIONID=320E4C622043566D5424627BDE11997D.node3; Path=/; Secure; HttpOnly"], "x-content-type-options"=>["nosniff"], "x-xss-protection"=>["1; mode=block"], "cache-control"=>["no-cache, no-store, max-age=0, must-revalidate"], "pragma"=>["no-cache"], "expires"=>["0"], "vary"=>["Accept-Encoding,User-Agent"], "connection"=>["close"], "transfer-encoding"=>["chunked"], "content-type"=>["application/json;charset=UTF-8"]}>

Изменения сеанса, и пользователь не вошел в систему. Те же запросы с журналом curlпользователь успешноИсследования показали, что это может быть непросто и это решение тоже не работает.

Есть идеи, что я делаю неправильно и в каком направлении думать?Измените на Фарадей, как предложено здесь ?

1 Ответ

0 голосов
/ 04 марта 2019

Чтобы войти через HTTParty, вам нужно искать больше вещей, чем куки.Вы также должны увидеть CSRF_token.Я думаю, что вы можете получить authenticity_token с помощью метода gsub, но я попытался, и было довольно сложно создать регулярное выражение.Поэтому я использовал Нокогири для получения токена, который на самом деле присутствует в знаке в форме.Ниже приведены подробности, и в конце я добавлю весь код.

Добавляя необходимые гемы, вы можете добавить его в Gemfile

gem 'httparty'
gem 'nokogiri'

Запустить bundle install, чтобы установить гем.

Чтобы получить CSRF_token, мы должны получить страницу sign_in.

url = "http://localhost:3000/users/sign_in"
get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]

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

cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

Здесь мы получаем куки, где также присутствует сессия.Теперь пришло время получить окончательные параметры, а затем мы отправим файлы cookie и сеанс для входа в систему

params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@email.com",·
          "user[password]"=>"password"}

params["commit"] = "Login"

Теперь параметры готовы, вы можете использовать следующий запрос httparty для входа и получения файлов cookie.

response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )

Теперь для другого запроса вы можете запустить тот же метод куки-файлов, чтобы вернуть все куки-файлы

cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

А для доступа к другим страницам вы можете отправить запрос с куки-файлами, как мы это делали в примере выше.Помните, что если вы снова собираетесь использовать какую-либо страницу, имеющую форму, вам снова нужно получить ее csrf.

response = HTTParty.post("http://localhost:3000/users/other_urls", {headers: {'Cookie' => cookie_hash.to_cookie_string }} )

Я попробовал этот код, и он работает отлично.Вот полный код для вашего использования

require 'httparty'
require 'Nokogiri'
require 'Pry'

url = "http://localhost:3000/users/sign_in"

get_response = HTTParty.get(url)
noko_doc = Nokogiri::HTML(get_response)
auth_token = noko_doc.css('form').css('input[name="authenticity_token"]').first.values[2]
cookie_hash = HTTParty::CookieHash.new
get_response.get_fields('Set-Cookie').each { |c| cookie_hash.add_cookies(c) }

params = {"utf8" => "✓", "authenticity_token" => auth_token, "user[email]"=>"user@example.com",·
          "user[password]"=>"password"}

params["commit"] = "Login"

response = HTTParty.post("http://localhost:3000/users/sign_in", {:body=>params, headers: {'Cookie' => cookie_hash.to_cookie_string }} )

puts response
...