Faraday: Передача URL-адреса со встроенной базовой аутентификацией не работает

Созданный на 1 сент. 2021  ·  5Комментарии  ·  Источник: lostisland/faraday

Недавний рефакторинг промежуточного программного обеспечения для аутентификации нарушил передачу URL-адреса со встроенной базовой аутентификацией в части пользовательской информации URI, поскольку basic_auth все еще используется в url_prefix= https://github.com/lostisland/faraday/blob/0f9626c48d0daa24888cb4e5e7962c106a48d97f/ библиотека / 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://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

Мы должны решить, хотим ли мы исправить это или удалить поддержку этой функции.

См. Комментарий @etiennebarrie в https://github.com/lostisland/faraday/issues/1308#issuecomment -909109525_

bug unconfirmed

Самый полезный комментарий

Привет, вот еще один вариант использования: elastic / elasticsearch-ruby # 1479

Все 5 Комментарий

@etiennebarrie Цитирую ваши мысли из комментария:

Хотя я не против отказа от basic_auth и авторизации в Connection, я думаю, что возможность иметь базовую аутентификацию, встроенную в 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 / пользователя / пароля.


Мы можем полностью разделить каждый секрет на три или даже сохранить в секрете один URL-адрес, но извлечь пароль пользователя, прежде чем передать его Фарадею.

Да, я так подумал, спасибо, что подтвердили @etiennebarrie 👍

Привет, вот еще один вариант использования: elastic / elasticsearch-ruby # 1479

Спасибо за вклад @tagliala , в конечном итоге мы хотим угодить сообществу, поэтому важно понимать, насколько эта функция используется, чтобы решить ее будущее.

Это, очевидно, широко распространенная библиотека, поэтому большое спасибо за указание на нее

Была ли эта страница полезной?
0 / 5 - 0 рейтинги