Faraday: La transmission d'une URL avec une authentification de base intégrée est interrompue

Créé le 1 sept. 2021  ·  5Commentaires  ·  Source: lostisland/faraday

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_

bug unconfirmed

Commentaire le plus utile

Bonjour, voici un autre cas d'utilisation : elastic/elasticsearch-ruby#1479

Tous les 5 commentaires

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

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

subvertallchris picture subvertallchris  ·  5Commentaires

ryanbyon picture ryanbyon  ·  3Commentaires

JasonBarnabe picture JasonBarnabe  ·  4Commentaires

jedeleh picture jedeleh  ·  3Commentaires

mattmill30 picture mattmill30  ·  4Commentaires