Faraday: 基本認証が埋め込まれたURLの受け渡しが壊れている

作成日 2021年09月01日  ·  5コメント  ·  ソース: lostisland/faraday

最近の認証ミドルウェアのリファクタリングでは、基本認証がurl_prefix= https://github.com/lostisland/faraday/blob/0f9626c48d0daa24888cb4e5e7962c106a48d97f/で引き続き使用されているため、URIのユーザー情報部分に基本認証が埋め込まれたURLを渡すことができませんurl_prefix= 。 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>'

これを実証するテストは、 https

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

これを修正するか、この機能のサポートを削除するかを決定する必要があります。

@etiennebarrieによってコメントを参照してくださいhttps://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_

bug unconfirmed

最も参考になるコメント

こんにちは、ここに別のユースケースがあります:elastic / elasticsearch-ruby#1479

全てのコメント5件

@etiennebarrieコメントからあなたの考えを引用しています:

Connectionでbasic_authと承認を廃止することに反対しているわけではありませんが、基本認証をURLに埋め込むことができると非常に便利だと思います(たとえば、シークレットで構成できます)。

これに対するサポートを削除することを真剣に考えています。
この方法は2005年に廃止

上記の例についても興味があります。

たとえば、シークレットで構成できます
basic_authミドルウェアを使用すると、どのようにシークレットを使用できないのかわかりませんか?
このようなものはうまくいきませんか?

# 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

基本的には次のことを行います。

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

したがって、URL /ユーザー/パスワードごとに1つのシークレットが必要です。


各シークレットを完全に3つに分割することも、単一のURLシークレットを保持して、ファラデーに渡す前にユーザーパスワードを抽出することもできます。

はい、それは私が思ったことです、 @ etiennebarrieを確認して

こんにちは、ここに別のユースケースがあります:elastic / elasticsearch-ruby#1479

@taglialaの入力に感謝します。最終的にはコミュニティを喜ばせたいので、この機能が将来を決定するためにどれだけ使用されているかを理解することが重要です。

これは明らかに広く普及しているライブラリなので、指摘してくれてありがとう

このページは役に立ちましたか?
0 / 5 - 0 評価