Faraday: ВНИМАНИЕ: `Faraday :: Connection # basic_auth` устарел

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

Основная информация

  • Версия Фарадея: 1.7.1
  • Версия Ruby: 3.0.2

Описание проблемы

Увидел предупреждение об устаревании, обновленный код в соответствии с документированными базовыми инструкциями по авторизации . Документированный код вызывает ошибку с рядом аргументов.

Не уверен, что документы неверны или проблема связана с драгоценным камнем.

Действия по воспроизведению

http = Faraday.new do |conn|
  conn.request(:authorization, :basic, 'username', 'password')
end

http.post("https://example.com")
ArgumentError: wrong number of arguments (given 4, expected 3)
from /Users/mscoutermarsh/.rbenv/versions/3.0.2/lib/ruby/gems/3.0.0/gems/faraday-1.7.1/lib/faraday/request/authorization.rb:43:in `initialize'

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

Документы неправильные :) Я только что открыл PR, чтобы исправить это.

А пока использовать его нужно так:

http = Faraday.new do |conn|
  conn.request(:basic_auth, 'username', 'password')
end

Привет! Контекст для веб-сайта документации не рифмуется с сообщением об устаревании версии 1.x: «все документы веб-сайта - это предстоящая версия 2.0». Та версия, где удален старый способ.

Контекст упоминается только в README - это слабость, с которой мы хотели бы получить конкретную помощь на сайте.

Ссылка на эту часть:

https://github.com/lostisland/faraday#attention

@peterberkenbosch верен, это правильный способ использования промежуточного программного обеспечения в Faraday 1.x, в то время как документация показывает правильное использование для предстоящей версии 2.0.

Извините за путаницу, это не первый случай, когда подобная проблема поднимается. Я буду искать быстрое решение, чтобы прояснить ситуацию

Спасибо! Теперь все хорошо. ❤️

Привет @iMacTia!

У меня все еще есть проблема с этим вопросом.
Я использую Faraday 1.7.1 и Ruby 2.7.2.

Изначально я создал такое соединение

client = Faraday.new(url: url) do |faraday|
    faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.headers["Authorization"] = "token #{token}"
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
  end

Основываясь на вышеизложенном, я предполагаю, что если я переключусь на использование faraday.request (: token_auth, token), это должно помочь добавить заголовок в запрос, поэтому я переключился на

client = Faraday.new(url: url) do |faraday|
    faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.request(:token_auth, token)
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
end

Вышеупомянутый клиент используется таким образом, и я получил ошибку "errors"=>["Authentication Required"]

client.get(path, {"sort"=>"created_at", "direction"=>"desc", "per_page"=>100})

Я также отлаживал код, и почему-то промежуточное ПО не сработало в запросе, и в заголовке нет Authorization , вот один дамп объекта запроса

#<struct Faraday::Request http_method=:get, path="hide/the/path", params={"sort"=>"created_at", "direction"=>"desc", "per_page"=>100}, headers={"Accept"=>"application/json;", "X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1"}, body=nil, options=#<Faraday::RequestOptions (empty)>>

Я использовал это неправильно или мне нужно создать новую ошибку?

Кстати, в чем разница между faraday.headers["Authorization"] = "token #{token}" и faraday.request(:token_auth, token) . Основываясь на моих новичках в рубиновых знаниях и чтении исходного кода, token_auth пытается установить заголовок, который эквивалентен faraday.headers[]= . Тогда в документе, почему мы рекомендуем использовать промежуточное ПО вместо того, чтобы напрямую устанавливать заголовок?

Привет, @xiaoxipang , там много хороших вопросов, дай мне посмотреть, смогу ли я на них ответить.

Я использовал это неправильно или мне нужно создать новую ошибку?

Вы использовали его правильно, но я подозреваю, что результат работы промежуточного программного обеспечения не совсем такой, как ожидает сервер.
Этот «токен аутентификации» выглядит довольно старым стандартом, который больше не используется и был заменен токеном носителя и другими механизмами. Вывод заголовка в вашем примере будет Authorization: Token token=token , обратите внимание на префикс token= , которого, как я подозреваю, ваш сервер не ожидает. Чтобы исправить это, вы можете сделать следующее:

client = Faraday.new(url: url) do |faraday|
    # This header is not necessary, it will be set by the json middleware
    # faraday.headers["Accept"] = "application/json"
    faraday.headers["X-Version"] = "2"
    faraday.request(:authorization, 'Token', token)
    faraday.request(:json)
    faraday.response(:json, content_type: /\bjson$/)
    faraday.adapter(Faraday.default_adapter)
end

Это правильно установит заголовок на Authorization: Token token (без префикса).
Пожалуйста, попробуйте и дайте мне знать, работает ли оно!

Я также отлаживал код, и почему-то промежуточное ПО не сработало в запросе, и в заголовке нет авторизации, вот один дамп объекта запроса

Это странно, я только что протестировал приведенный выше код, и он у меня работает так, как ожидалось. Увидев struct Faraday::Request в отладке, я подозреваю, что вы могли смотреть на объект слишком рано, до того, как промежуточное ПО установит заголовок.
Если вы запустите запрос и проверите ответ, вы обязательно должны увидеть его там:

client.get('https://google.co.uk')
 => #<Faraday::Response:0x00007fdd01ad1340
  @on_complete_callbacks=[],
  @env=#<Faraday::Env
    @method=:get
    @url=#<URI::HTTPS https://google.co.uk/>
    @request=#<Faraday::RequestOptions (empty)>
    @request_headers={"X-Version"=>"2", "User-Agent"=>"Faraday v1.7.1", "Authorization"=>"Token token"}
    ...

Или другой способ - добавить промежуточное ПО faraday.response :logger ТОЛЬКО ПЕРЕД вашим адаптером, таким образом он будет регистрировать запрос после того, как все промежуточное ПО вступит в силу, и вы обязательно должны его увидеть.

Кстати, в чем разница между faraday.headers ["Authorization"] = "token # {token}" и faraday.request (: token_auth, token). Основываясь на моих новичках в знаниях Ruby и чтении исходного кода, token_auth пытается установить заголовок, который эквивалентен faraday.headers [] =. Тогда в документе, почему мы рекомендуем использовать промежуточное ПО вместо того, чтобы напрямую устанавливать заголовок?

Основная причина этого предложения заключается в том, что промежуточное ПО обычно обеспечивает большую функциональность.
Например, промежуточное ПО token_auth позволяет вам также устанавливать свойства токена и автоматически форматировать их:

faraday.request(:token_auth, 'token', {prop1: value1, prop2: value2})
# This produces `Authorization: Token token=token prop1=value1 prop2=value2

Аналогичным образом промежуточное ПО basic_auth автоматически выполняет кодировку Base64 вашей пары пользователь / пароль.

Я согласен, что промежуточное ПО faraday.request(:authorization, 'Token', token) выше не делает ничего, кроме ручной установки заголовка, но, например, в Faraday v2 это промежуточное ПО принимает лямбда / proc для аргумента token и автоматически разрешает это на каждом запрос. Это позволяет вам иметь класс TokenStorage и динамически изменять токен между разными запросами. При другом подходе вам нужно будет вручную вводить заголовок при каждом запросе или каждый раз заново создавать соединение.

Я надеюсь, что это ответит на ваш вопрос, но короче говоря, вы умеете использовать оба метода, поэтому используйте тот, который вам больше всего нравится 😄

@iMacTia Большое спасибо за помощь и подробное объяснение!

Пожалуйста, попробуйте и дайте мне знать, работает ли оно!

faraday.request(:authorization, "token", token) у меня работает.

Или другой способ - добавить промежуточное ПО faraday.response: logger ПРОСТО ПЕРЕД вашим адаптером, таким образом он будет регистрировать
запрос после того, как все промежуточное ПО вступило в силу, и вы обязательно должны его увидеть.

С этого момента очень приятно знать, как отлаживать. И, используя это, вы полностью правы:
При использовании faraday.request(:authorization, "token", token) заголовок будет Authorization: "token token_value"
При использовании faraday.request(:token_auth, token) заголовок будет Authorization: "Token token=\"token_value\""

Это странно, я только что протестировал приведенный выше код, и он у меня работает так, как ожидалось. Увидев структуру Faraday :: Request при отладке, я подозреваю, что вы могли смотреть на объект слишком рано, до того, как промежуточное ПО установило заголовок.

Хорошо, я поставил точку останова в connection#run_request и в этот момент промежуточное ПО не было вызвано. Я добавляю новую точку останова в Faraday :: Request :: Authorization и теперь вижу, как это работает.

Надеюсь, это ответит на ваш вопрос, но вкратце вы умеете использовать оба метода, поэтому используйте тот, который вам больше всего нравится.

Да, и еще раз спасибо!

как избавиться от предупреждения об устаревании на данный момент?

      builder.request :basic_auth, <strong i="6">@client_id</strong>, <strong i="7">@client_secret</strong>

по-прежнему вызывает у меня предупреждение в версии 1.7.1, и, как упомянул

@paukul

http = Faraday.new do |conn|
  conn.request(:basic_auth, 'username', 'password')
end

Исправлено для нас. Выглядит так же, как ваш, не понимаю, почему он все еще предупреждает вас.

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