Faraday: AVISO: `Faraday :: Connection # basic_auth` está obsoleto

Criado em 31 ago. 2021  ·  9Comentários  ·  Fonte: lostisland/faraday

Informação básica

  • Versão Faraday: 1.7.1
  • Versão Ruby: 3.0.2

Descrição do problema

Viu o aviso de descontinuação e atualizou o código para corresponder às instruções básicas de autenticação documentadas . O código documentado lança uma série de argumentos de erro.

Não tenho certeza se os documentos estão errados ou se é um problema com a gema.

Passos para reproduzir

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'

Todos 9 comentários

Os documentos estão errados :) Acabei de abrir um PR para consertar isso.

Nesse ínterim, você precisa usá-lo assim:

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

Olá! O contexto para o site de documentação que não rima com a mensagem de desaprovação 1.x é: "todos os documentos do site são o 2.0 que está por vir". Essa versão onde a maneira antiga é removida.

O contexto é mencionado apenas no README - esta é uma fraqueza, para a qual adoraríamos receber ajuda concreta no front do site.

Link para essa parte:

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

@peterberkenbosch está correto, essa é a maneira certa de usar o middleware no Faraday 1.x, enquanto a documentação mostra o uso correto para a próxima v2.0.

Desculpe a confusão, esta não é a primeira vez que um problema como este é levantado. Vou procurar uma solução rápida para tornar as coisas mais claras

Obrigado! Tudo bem agora. ❤️

Olá @iMacTia ,

Eu ainda tenho problemas com esse problema.
Estou usando Faraday 1.7.1 e Ruby 2.7.2.

Eu originalmente criei uma conexão como esta

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

Com base na conversa acima, acho que se eu mudar para usar faraday.request (: token_auth, token), isso deve ajudar a adicionar o cabeçalho na solicitação, então mudei para

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

O cliente acima é usado desta forma e eu obtive o erro "errors"=>["Authentication Required"]

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

Eu também depurei o código e de alguma forma, o middleware não entrou em vigor na solicitação e nenhum Authorization no cabeçalho, aqui está um despejo de objeto de solicitação

#<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)>>

Usei de forma errada ou devo criar um novo bug?

BTW, qual é a diferença entre faraday.headers["Authorization"] = "token #{token}" e faraday.request(:token_auth, token) . Com base no meu conhecimento de ruby ​​newbie e lendo o código-fonte, token_auth está tentando definir o cabeçalho, que é equivalente a faraday.headers[]= . Então, no documento, por que recomendamos usar middleware em vez de definir diretamente o cabeçalho?

Olá, @xiaoxipang , muitas perguntas boas aí, deixe-me ver se consigo responder a todas.

Usei de forma errada ou devo criar um novo bug?

Você o usou corretamente, mas suspeito que a saída do middleware não é exatamente o que o servidor está esperando.
Este "token auth" parece um padrão bem antigo que não está mais sendo usado e foi substituído pelo token do Bearer e outros mecanismos. A saída do cabeçalho em seu exemplo seria Authorization: Token token=token , observe o prefixo token= , que suspeito que seu servidor não esteja esperando. Para corrigir isso, você pode fazer o seguinte:

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

Isso definirá o cabeçalho corretamente para Authorization: Token token (sem prefixo).
Experimente e diga-me se funciona!

Eu também depurei o código e de alguma forma, o middleware não entrou em vigor na solicitação e nenhuma autorização no cabeçalho, aqui está um despejo de objeto de solicitação

Isso é estranho, acabei de testar o código acima e ele funciona conforme o esperado para mim. Vendo struct Faraday::Request na depuração, eu suspeito que você pode estar olhando para o objeto muito cedo, antes que o cabeçalho seja definido pelo middleware.
Se você executar uma solicitação e verificar a resposta, com certeza deve vê-la lá:

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"}
    ...

Ou outra maneira é adicionar o middleware faraday.response :logger APENAS ANTES do adaptador, dessa forma ele registrará a solicitação depois que todo o middleware tiver entrado em vigor e você definitivamente deve vê-lo.

BTW, qual é a diferença entre faraday.headers ["Authorization"] = "token # {token}" e faraday.request (: token_auth, token). Com base no meu conhecimento de ruby ​​novato e lendo o código-fonte, token_auth está tentando definir o cabeçalho, que é equivalente a faraday.headers [] =. Então, no documento, por que recomendamos usar middleware em vez de definir diretamente o cabeçalho?

O principal motivo para essa sugestão é que o middleware geralmente oferece maior funcionalidade.
Por exemplo, o middleware token_auth permite que você defina propriedades de token também e os formate automaticamente:

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

De forma semelhante, o middleware basic_auth faz automaticamente uma codificação Base64 de seu par usuário / senha.

Eu concordo que o middleware faraday.request(:authorization, 'Token', token) acima não está fazendo muito mais do que definir manualmente o cabeçalho, mas por exemplo no Faraday v2 esse middleware aceita um lambda / proc para o argumento token e automaticamente resolve isso em cada solicitar. Isso permite que você tenha uma classe TokenStorage e altere dinamicamente o token entre as diferentes solicitações. Com a outra abordagem, você precisará injetar manualmente o cabeçalho em cada solicitação ou recriar a conexão todas as vezes.

Espero que isso responda à sua pergunta, mas resumindo, você é bom para usar os dois métodos, então use o que você mais gosta 😄

@iMacTia Muito obrigado pela ajuda e explicação detalhada!

Experimente e diga-me se funciona!

faraday.request(:authorization, "token", token) funciona para mim.

Ou outra forma é adicionar o faraday.response: logger middleware APENAS ANTES do seu adaptador, desta forma ele irá registrar o
pedido após todo o middleware ter entrado em vigor e você definitivamente deve vê-lo.

É muito bom saber depurar de agora em diante. E ao usar isso, você está totalmente correto:
Ao usar faraday.request(:authorization, "token", token) , o cabeçalho é Authorization: "token token_value"
Ao usar faraday.request(:token_auth, token) , o cabeçalho é Authorization: "Token token=\"token_value\""

Isso é estranho, acabei de testar o código acima e ele funciona conforme o esperado para mim. Vendo a struct Faraday :: Request na depuração, suspeito que você possa estar olhando o objeto muito cedo, antes que o cabeçalho seja definido pelo middleware.

Certo, coloquei o ponto de interrupção em connection#run_request e, naquele momento, o middleware não foi chamado. Eu adicionei um novo ponto de interrupção em Faraday :: Request :: Authorization e agora posso ver como funciona.

Espero que isso responda à sua pergunta, mas resumindo, você é bom para usar os dois métodos, então use o que mais gosta

Sim e obrigado novamente!

como se livrar do aviso de depreciação por enquanto?

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

ainda levanta o aviso para mim no 1.7.1 e, como @mscoutermarsh mencionou, a nova sintaxe ainda não está disponível.

@paukul

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

Corrigido para nós. É igual ao seu, não sei por que ainda está avisando.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

luizkowalski picture luizkowalski  ·  3Comentários

mattmill30 picture mattmill30  ·  4Comentários

jordansissel picture jordansissel  ·  5Comentários

mokolabs picture mokolabs  ·  3Comentários

JasonBarnabe picture JasonBarnabe  ·  4Comentários