Faraday: Das Übergeben einer URL mit eingebetteter Basisauthentifizierung ist fehlerhaft

Erstellt am 1. Sept. 2021  ·  5Kommentare  ·  Quelle: lostisland/faraday

Das kürzliche Refactoring der Authentifizierungs-Middleware brach die Übergabe einer URL mit eingebetteter Basic-Authentifizierung im Benutzerinfo-Teil der URI ab, weil basic_auth immer noch in 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>'

Ein Test, der dies demonstriert, ist hier verfügbar: 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

Wir sollten entscheiden, ob wir dies beheben oder die Unterstützung für diese Funktion entfernen möchten.

Siehe Kommentar von @etiennebarrie in https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_

bug unconfirmed

Hilfreichster Kommentar

Hallo, hier ist es ein weiterer Anwendungsfall: elastische/elasticsearch-ruby#1479

Alle 5 Kommentare

@etiennebarrie Ich zitiere deine Gedanken aus dem Kommentar:

Obwohl ich nicht gegen die Einstellung von basic_auth und Autorisierung für Connection bin, denke ich, dass es wirklich nützlich ist, Basic Auth in die URL eingebettet zu haben (sie kann beispielsweise in Secrets konfiguriert werden).

Ich denke ernsthaft darüber nach, die Unterstützung dafür zu entfernen.
Es scheint, als ob diese Praxis bereits 2005 eingestellt wurde und die meisten großen Browser ihre Unterstützung ebenfalls eingestellt haben.

Mich interessiert auch dein obiges Beispiel:

es kann zum Beispiel in Geheimnissen konfiguriert werden
Ich verstehe nicht, wie die Verwendung der basic_auth Middleware die Verwendung von Geheimnissen nicht zulassen würde.
Würde so etwas nicht funktionieren?

# 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

Wir machen grundsätzlich:

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

Wir brauchen also nur ein Geheimnis pro URL/Benutzer/Passwort.


Wir können jedes Geheimnis vollständig in drei Teile aufteilen oder sogar die einzelne URL geheim halten, aber das Benutzerpasswort extrahieren, bevor wir es an Faraday weitergeben.

Ja das dachte ich mir, danke für die Bestätigung @etiennebarrie 👍

Hallo, hier ist es ein weiterer Anwendungsfall: elastische/elasticsearch-ruby#1479

Danke für den Input @tagliala , letztendlich möchten wir der Community gefallen, daher ist es wichtig zu verstehen, wie oft diese Funktion genutzt wird, um über ihre Zukunft zu entscheiden.

Dies ist offensichtlich eine weit verbreitete Bibliothek, vielen Dank für den Hinweis

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen