1.7.1
3.0.2
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.
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'
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:
@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.