La récente refactorisation du middleware d'authentification a cassé le passage d'une URL avec une authentification de base intégrée dans la partie informations utilisateur de l'URI, car basic_auth est toujours utilisé dans 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>'
Un test démontrant cela est disponible ici : 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
Nous devons décider si nous voulons résoudre ce problème ou supprimer la prise en charge de cette fonctionnalité.
Voir le commentaire de @etiennebarrie dans https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_
@etiennebarrie Je cite vos réflexions dans le commentaire :
Bien que je ne sois pas contre la dépréciation de basic_auth et l'autorisation sur Connection, je pense qu'il est vraiment utile de pouvoir intégrer l'authentification de base dans l'URL (elle peut être configurée dans des secrets par exemple).
Je pense sérieusement à supprimer le support pour cela.
Il semble que cette pratique ait été dépréciée en 2005 et que la plupart des principaux navigateurs aient également abandonné sa prise en charge.
Je suis également curieux de votre exemple ci-dessus:
il peut être configuré en secrets par exemple
Je ne vois pas en quoi l'utilisation du middlewarebasic_auth
ne permettrait pas d'utiliser des secrets ?
Est-ce que quelque chose comme ça ne fonctionnerait pas ?
# 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
Nous faisons essentiellement :
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
Nous n'avons donc besoin que d'un secret par URL/utilisateur/mot de passe.
Nous pouvons totalement diviser chaque secret en trois, ou même garder secrète l'URL unique mais extraire le mot de passe de l'utilisateur avant de le transmettre à Faraday.
Oui c'est bien ce que je pensais, merci de confirmer @etiennebarrie 👍
Bonjour, voici un autre cas d'utilisation : elastic/elasticsearch-ruby#1479
Merci pour la contribution @tagliala , nous voulons finalement faire plaisir à la communauté, il est donc important de comprendre à quel point cette fonctionnalité est utilisée afin de décider de son avenir.
Il s'agit évidemment d'une bibliothèque très répandue, merci beaucoup de l'avoir signalé
Commentaire le plus utile
Bonjour, voici un autre cas d'utilisation : elastic/elasticsearch-ruby#1479