A recente refatoração de middleware de autenticação quebrou a passagem de um URL com autenticação básica incorporada na parte de informações do usuário do URI, porque basic_auth ainda é usado em url_prefix=
https://github.com/lostisland/faraday/blob/0f9626c48d0daa24888cb4e5e7962c106a48d97f/ lib / 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>'
Um teste que demonstra isso está disponível aqui: 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
Devemos decidir se queremos corrigir isso ou remover o suporte para este recurso.
Veja o comentário de @etiennebarrie em https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_
@etiennebarrie , estou citando sua opinião sobre o comentário:
Embora eu não seja contra o uso de basic_auth e autorização no Connection, acho que poder ter autenticação básica incorporada na URL é realmente útil (pode ser configurado em segredos, por exemplo).
Estou pensando seriamente em remover o suporte para isso.
Parece que essa prática foi descontinuada em 2005 e a maioria dos principais navegadores também está deixando de oferecer suporte.
Também estou curioso sobre o seu exemplo acima:
pode ser configurado em segredos, por exemplo
Não vejo como usar o middlewarebasic_auth
não permitiria o uso de segredos.
Algo assim não funcionaria?
# 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
Basicamente, fazemos:
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
Portanto, precisamos apenas de um segredo por URL / usuário / senha.
Podemos dividir totalmente cada segredo em três, ou até mesmo manter o segredo do URL único, mas extrair a senha do usuário antes de passá-la para Faraday.
Sim, foi o que pensei, obrigado por confirmar @etiennebarrie 👍
Olá, aqui está outro caso de uso: elastic / elasticsearch-ruby # 1479
Obrigado pela contribuição @tagliala , em última análise, queremos agradar a comunidade, por isso é importante entender o quanto esse recurso é usado para decidir sobre seu futuro.
Esta é obviamente uma biblioteca muito difundida, muito obrigado por apontá-la
Comentários muito úteis
Olá, aqui está outro caso de uso: elastic / elasticsearch-ruby # 1479