Faraday: Pasar una URL con autenticación básica incrustada no funciona

Creado en 1 sept. 2021  ·  5Comentarios  ·  Fuente: lostisland/faraday

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_

bug unconfirmed

Comentario más útil

Hola, aquí hay otro caso de uso: elastic / elasticsearch-ruby # 1479

Todos 5 comentarios

@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 middleware basic_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.

¿Fue útil esta página
0 / 5 - 0 calificaciones