1.7.1
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'
Документы неправильные :) Я только что открыл PR, чтобы исправить это.
А пока использовать его нужно так:
http = Faraday.new do |conn|
conn.request(:basic_auth, 'username', 'password')
end
Привет! Контекст для веб-сайта документации не рифмуется с сообщением об устаревании версии 1.x: «все документы веб-сайта - это предстоящая версия 2.0». Та версия, где удален старый способ.
Контекст упоминается только в README - это слабость, с которой мы хотели бы получить конкретную помощь на сайте.
Ссылка на эту часть:
@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
Исправлено для нас. Выглядит так же, как ваш, не понимаю, почему он все еще предупреждает вас.