OpenUri, вызывающий 401 несанкционированную ошибку с HTTPS URL

Я добавляю функциональность, которая очищает страницу XML из источника, который требует использования HTTPS-соединения с аутентификацией. Я пытаюсь использовать решение Ryanscast #190 Райана Бейтса, но у меня ошибка 401 Authentication.

Вот мой тестовый скрипт на Ruby:

require 'rubygems'
require 'nokogiri'
require 'open-uri'

url = "https://biblesearch.americanbible.org/passages.xml?q[]=john+3:1-5&version=KJV"
doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password']))
puts doc.xpath("//text_preview")

Вот вывод консоли после запуска моего скрипта:

/usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `block in connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:54:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/timeout.rb:99:in `timeout'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:799:in `connect'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:755:in `do_start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/net/http.rb:744:in `start'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:306:in `open_http'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:775:in `buffer_open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:203:in `block in open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `catch'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:201:in `open_loop'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:146:in `open_uri'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:677:in `open'
from /usr/local/rvm/rubies/ruby-1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:33:in `open'
from scrape.rb:6:in `<main>'

В моем исследовании я видел один пост, в котором предлагалось использовать следующую опцию: 1.9.3:

doc = Nokogiri::XML(open(url, :http_basic_authentication => ['username' ,'password'], :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))

Однако это тоже не сработало. Я был бы признателен за понимание этой проблемы.

3 ответа

Решение

Данный URL будет перенаправлен на /v1/KJV/passages.xml?q[]=john+3%3A1-5 с кодом статуса HTTP 302 Found, OpenURI понимает перенаправление, но автоматически удаляет заголовок аутентификации (возможно) по соображениям безопасности. (*)

Если вы получаете доступ "http://biblesearch.americanbible.org/v1/KJV/passages.xml?q[]=john+3%3A1-5" напрямую, вы получите ожидаемый результат.:-)

(*) Вы можете найти в open-uri.rb:

if redirect
  ### snip ###
  if options.include? :http_basic_authentication
    # send authentication only for the URI directly specified.
    options = options.dup
    options.delete :http_basic_authentication
  end

Вы можете сделать это, и это должно работать тоже:

open(url, :http_basic_authentication => [user, pass] ) doc = Nokogiri::HTML(open(url, :http_basic_authentication => [user, pass] ))

Затем вы можете проанализировать документ, как хотите. Передав http_basic_authentication в заголовке снова во втором запросе, вы восполните удаленный заголовок в первом запросе. Надеюсь, что это работает для вас.

http://http-basic-authentication-nokogiri.blogspot.com/2014/08/http-basic-authentication-using-nokogiri.html

Вы говорите, что вам нужно использовать HTTPS, но вы используете протокол HTTP:

url = "http://biblesearch...."

OpenURI понимает как HTTP, так и HTTPS. Если вы хотите подключиться с использованием HTTPS, измените протокол в URL на HTTPSзатем установите соединение:

url = "https://biblesearch...."
Другие вопросы по тегам