Когда используется базовая аутентификация, имя пользователя и пароль объединяются, а затем кодируются с использованием base64.Закодированная приведенная строка отправляется на сервер в заголовке Authorization
с использованием Basic
Теперь можно обойти эту проблему, если у вас возникли проблемы с использованием add_auth
, - самостоятельно передать заголовок авторизации.:
username = 'Radu'
password = 'mypassword'
agent = Mechanize.new do |agent|
agent.pre_connect_hooks << lambda { |agent, request| request["Authorization"] = "Basic #{Base64.strict_encode64(username + ':' + password)}" }
end
page = agent.get("https://website.net/listingapi")
Редактировать 1
Теперь, когда я снова читаю журналы, я вижу, что заголовок www-authenticate
говорит Bearer, Basic realm=ListingApi
.Вместо этого следует сказать Basic realm=ListingApi
.
Проблема в том, что response_authenticate не может найти какой-либо вызов, скорее всего, потому что запрашиваемый API не учитывает эту часть RFC7235 в отношении вызова.
Отсутствующий вызов поднимается на 401 после этой строки
[1] pry(main)> authenticate_parser = Mechanize::HTTP::WWWAuthenticateParser.new
=> #<Mechanize::HTTP::WWWAuthenticateParser:0x00007fe2a5c74ec8 @scanner=nil>
[2] pry(main)> authenticate_parser.parse "Basic realm=ListingApi"
=> [#<struct Mechanize::HTTP::AuthChallenge scheme=nil, params=nil, raw=nil>]
[3] pry(main)> authenticate_parser.parse "Bearer, Basic realm=ListingApi"
=> []
Редактировать 2
Причина, по которой HTTParty работает, заключается в том, что они добавляют Заголовок авторизации заранее непосредственно в Net :: HTTP :: Get.Механизация использует всю авторизацию вызов-ответ, и они будут добавлять ее, только если схема вызова Basic
.