La reciente refactorización del middleware de autenticación se rompió al pasar una URL con autenticación básica incrustada en la parte de información del usuario del URI, porque basic_auth todavía se usa en 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>'
Una prueba que demuestra esto está disponible aquí: 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
Deberíamos decidir si queremos solucionar esto o eliminar la compatibilidad con esta función.
Ver comentario de @etiennebarrie en https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_
@etiennebarrie Estoy citando sus pensamientos del comentario:
Si bien no estoy en contra de desaprobar basic_auth y la autorización en Connection, creo que poder tener la autenticación básica incrustada en la URL es realmente útil (se puede configurar en secretos, por ejemplo).
Estoy pensando seriamente en eliminar el soporte para esto.
Parece que esta práctica se ha desaprobado en 2005 y la mayoría de los principales navegadores también han abandonado su soporte.
También tengo curiosidad por tu ejemplo anterior:
se puede configurar en secretos por ejemplo
No veo cómo el uso del middlewarebasic_auth
no permitiría usar secretos.
¿No funcionaría algo como esto?
# 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
Básicamente hacemos:
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
Así que solo necesitamos un secreto por URL / usuario / contraseña.
Podemos dividir totalmente cada secreto en tres, o incluso mantener la URL única en secreto, pero extraer la contraseña del usuario antes de pasarla a Faraday.
Si eso es lo que pensé, gracias por confirmar @etiennebarrie 👍
Hola, aquí hay otro caso de uso: elastic / elasticsearch-ruby # 1479
Gracias por la entrada @tagliala , en última instancia, queremos complacer a la comunidad, por lo que es importante comprender cuánto se usa esta función para decidir sobre su futuro.
Obviamente, esta es una biblioteca muy extendida, muchas gracias por señalarla.
Comentario más útil
Hola, aquí hay otro caso de uso: elastic / elasticsearch-ruby # 1479