Недавний рефакторинг промежуточного программного обеспечения для аутентификации нарушил передачу URL-адреса со встроенной базовой аутентификацией в части пользовательской информации URI, поскольку basic_auth все еще используется в url_prefix=
https://github.com/lostisland/faraday/blob/0f9626c48d0daa24888cb4e5e7962c106a48d97f/ библиотека / faraday / connection.rb # L364 -L367
~/src/github.com/lostisland/faraday (1.x) $ ruby -Ilib -rfaraday -rfaraday/net_http -rjson -e "puts JSON.load(Faraday.new(url: 'https://user:[email protected]/headers').get.body)['headers']['Authorization']"
WARNING: `Faraday::Connection#basic_auth` is deprecated; it will be removed in version 2.0.
While initializing your connection, use `#request(:basic_auth, ...)` instead.
See https://lostisland.github.io/faraday/middleware/authentication for more usage info.
Basic dXNlcjpwYXNzd29yZA==
~/src/github.com/lostisland/faraday (main) $ ruby -Ilib -rfaraday -rfaraday/net_http -rjson -e "puts JSON.load(Faraday.new(url: 'https://user:[email protected]/headers').get.body)['headers']['Authorization']"
lib/faraday/connection.rb:365:in `block in url_prefix=': undefined method `basic_auth' for #<Faraday::Connection:0x00007fed250abaa8 @parallel_manager=nil, @headers={}, @params={}, @options=#<Faraday::RequestOptions (empty)>, @ssl=#<Faraday::SSLOptions (empty)>, @default_parallel_manager=nil, @manual_proxy=nil, @builder=#<Faraday::RackBuilder:0x00007fed25092210 @adapter=Faraday::Adapter::NetHttp, @handlers=[Faraday::Request::UrlEncoded]>, @url_prefix=#<URI::HTTPS https://user:[email protected]/headers>> (NoMethodError)
from lib/faraday/connection.rb:506:in `with_uri_credentials'
from lib/faraday/connection.rb:364:in `url_prefix='
from lib/faraday/connection.rb:84:in `initialize'
from lib/faraday.rb:96:in `new'
from lib/faraday.rb:96:in `new'
from -e:1:in `<main>'
Тест, демонстрирующий это, доступен здесь: https://github.com/lostisland/faraday/compare/1.x...etiennebarrie : test-basic-auth-in-url:
it 'uses User Information from the URI for Basic authentication' do
conn.url_prefix = 'http://user:[email protected]'
expect(conn.url_prefix.to_s).to eq('http://sushi.com/')
request = conn.build_request(:get)
expect(request.headers['Authorization']).to eq("Basic #{Base64.strict_encode64('user:password')}")
end
Мы должны решить, хотим ли мы исправить это или удалить поддержку этой функции.
См. Комментарий @etiennebarrie в https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_
@etiennebarrie Цитирую ваши мысли из комментария:
Хотя я не против отказа от basic_auth и авторизации в Connection, я думаю, что возможность иметь базовую аутентификацию, встроенную в URL-адрес, действительно полезна (например, ее можно настроить в секретах).
Я серьезно подумываю убрать опору для этого.
Похоже, что эта практика устарела еще в 2005 году, и большинство основных браузеров также отказались от ее поддержки.
Мне также интересно узнать о вашем примере выше:
его можно настроить в секрете, например
Я не понимаю, как использование промежуточного программного обеспеченияbasic_auth
не позволяет использовать секреты?
Разве что-то подобное не сработает?
# Faraday 1.x
conn = Faraday.new(url_with_no_userinfo) do |f|
conn.request :basic_auth, Secrets.basic_auth_user, Secrets.basic_auth_pass
...
end
В основном мы делаем:
def connection
Faraday.new(url: server) do
# other config
end
end
def server
if global?
secrets.global
elsif something?
secrets.other
elsif something_else?
secrets.another
end
end
Таким образом, нам нужен только один секрет для каждого URL / пользователя / пароля.
Мы можем полностью разделить каждый секрет на три или даже сохранить в секрете один URL-адрес, но извлечь пароль пользователя, прежде чем передать его Фарадею.
Да, я так подумал, спасибо, что подтвердили @etiennebarrie 👍
Привет, вот еще один вариант использования: elastic / elasticsearch-ruby # 1479
Спасибо за вклад @tagliala , в конечном итоге мы хотим угодить сообществу, поэтому важно понимать, насколько эта функция используется, чтобы решить ее будущее.
Это, очевидно, широко распространенная библиотека, поэтому большое спасибо за указание на нее
Самый полезный комментарий
Привет, вот еще один вариант использования: elastic / elasticsearch-ruby # 1479