Faraday: AVERTISSEMENT : `Faraday::Connection#basic_auth` est obsolÚte

CrĂ©Ă© le 31 aoĂ»t 2021  Â·  9Commentaires  Â·  Source: lostisland/faraday

Informations de base

  • Version Faraday : 1.7.1
  • Version Rubis : 3.0.2

Description du problĂšme

Vu l'avertissement de dépréciation, le code mis à jour pour correspondre aux instructions d'authentification de base documentées . Le code documenté renvoie un certain nombre d'erreurs d'arguments.

Je ne sais pas si les documents sont faux ou s'il s'agit d'un problĂšme avec la gemme.

Étapes à reproduire

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'

Tous les 9 commentaires

Les docs sont fausses :) Je viens d'ouvrir un PR pour résoudre ce problÚme.

En attendant, vous devez l'utiliser comme ceci:

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

Salut! Le contexte du site Web de documentation ne rimant pas avec le message d'obsolescence 1.x est : "tous les documents du site Web sont le 2.0 Ă  venir". Cette version oĂč l'ancienne mĂ©thode est supprimĂ©e.

Le contexte n'est mentionné que dans le README - c'est une faiblesse, pour laquelle nous aimerions obtenir une aide concrÚte sur le front du site Web.

Lien vers cette partie :

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

@peterberkenbosch est correct, c'est la bonne façon d'utiliser le middleware dans Faraday 1.x, tandis que la documentation montre l'utilisation correcte pour la prochaine v2.0.

Désolé pour la confusion, ce n'est pas la premiÚre fois qu'un problÚme comme celui-ci est soulevé. Je vais chercher une solution rapide pour rendre les choses plus claires

Merci! Tout va bien maintenant. ❀

Bonjour @iMacTia ,

J'ai toujours un problĂšme sur ce problĂšme.
J'utilise Faraday 1.7.1 et Ruby 2.7.2.

J'ai initialement créé une connexion comme celle-ci

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

Sur la base de l'exposĂ© ci-dessus, je suppose que si je passe Ă  l'utilisation de faraday.request(:token_auth, token), cela devrait aider Ă  ajouter un en-tĂȘte dans la demande, donc je suis passĂ© Ă 

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

Le client ci-dessus est utilisé de cette maniÚre et j'ai l'erreur "errors"=>["Authentication Required"]

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

J'ai Ă©galement dĂ©boguĂ© le code et d'une maniĂšre ou d'une autre, le middleware n'a pas pris effet dans la demande et pas de Authorization dans l'en-tĂȘte, voici un vidage d'objet de demande

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

Est-ce que je l'ai mal utilisé ou dois-je créer un nouveau bug ?

BTW, quelle est la diffĂ©rence entre faraday.headers["Authorization"] = "token #{token}" et faraday.request(:token_auth, token) . Sur la base de mes connaissances de dĂ©butant en ruby ​​et de la lecture du code source, token_auth essaie de dĂ©finir l'en-tĂȘte, ce qui Ă©quivaut Ă  faraday.headers[]= . Alors dans la doc, pourquoi recommandons-nous d'utiliser un middleware au lieu de dĂ©finir directement l'en-tĂȘte ?

Salut @xiaoxipang , il y a beaucoup de bonnes questions là-dedans, laissez-moi voir si je peux y répondre à toutes.

Est-ce que je l'ai mal utilisé ou dois-je créer un nouveau bug ?

Vous l'avez utilisé correctement, mais je soupçonne que la sortie du middleware n'est pas exactement ce que le serveur attend.
Cette "autorisation de jeton" ressemble Ă  une norme assez ancienne qui n'est plus utilisĂ©e et a Ă©tĂ© remplacĂ©e par le jeton Bearer et d'autres mĂ©canismes. La sortie d'en-tĂȘte dans votre exemple serait Authorization: Token token=token , notez le prĂ©fixe token= , que je soupçonne que votre serveur n'attend pas. Pour rĂ©soudre ce problĂšme, vous pouvez procĂ©der comme suit :

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

Cela dĂ©finira correctement l'en-tĂȘte sur Authorization: Token token (pas de prĂ©fixe).
S'il vous plaĂźt essayez-le et dites-moi si cela fonctionne!

J'ai Ă©galement dĂ©boguĂ© le code et d'une maniĂšre ou d'une autre, le middleware n'a pas pris effet dans la demande et aucune autorisation dans l'en-tĂȘte, voici un vidage d'objet de demande

C'est Ă©trange, je viens de tester le code ci-dessus et cela fonctionne comme prĂ©vu pour moi. En voyant le struct Faraday::Request dans le dĂ©bogage, je soupçonne que vous regardez l'objet trop tĂŽt, avant que l'en-tĂȘte ne soit dĂ©fini par le middleware.
Si vous exĂ©cutez une requĂȘte et vĂ©rifiez la rĂ©ponse, vous devriez certainement la voir ici :

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 une autre façon consiste à ajouter le faraday.response :logger middleware JUSTE AVANT votre adaptateur, de cette façon, il enregistrera la demande une fois que tous les middlewares auront pris effet et vous devriez certainement le voir.

BTW, quelle est la diffĂ©rence entre faraday.headers["Authorization"] = "token #{token}" et faraday.request(:token_auth, token). Sur la base de mes connaissances de dĂ©butant en ruby ​​et de la lecture du code source, token_auth essaie de dĂ©finir l'en-tĂȘte, ce qui Ă©quivaut Ă  faraday.headers[]=. Alors dans la doc, pourquoi recommandons-nous d'utiliser un middleware au lieu de dĂ©finir directement l'en-tĂȘte ?

La principale raison de cette suggestion est que le middleware offre généralement une plus grande fonctionnalité.
Par exemple, le middleware token_auth vous permet également de définir les propriétés des jetons et de les formater automatiquement :

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

De la mĂȘme maniĂšre, le middleware basic_auth automatiquement un encodage Base64 de votre paire utilisateur/passe.

Je suis d'accord que le middleware faraday.request(:authorization, 'Token', token) ci-dessus ne fait pas beaucoup plus que dĂ©finir manuellement l'en-tĂȘte, mais par exemple dans Faraday v2, ce middleware accepte un lambda/proc pour l'argument token et le rĂ©sout automatiquement sur chaque demander. Cela vous permet d'avoir une classe TokenStorage et de changer dynamiquement le jeton entre diffĂ©rentes requĂȘtes. Avec l'autre approche, vous devrez injecter manuellement l'en-tĂȘte sur chaque demande ou recrĂ©er la connexion Ă  chaque fois.

J'espĂšre que cela rĂ©pond Ă  votre question, mais en bref, vous ĂȘtes bon d'utiliser les deux mĂ©thodes, alors utilisez celle que vous aimez le plus

@iMacTia Merci beaucoup pour l'aide et l'explication détaillée !

S'il vous plaĂźt essayez-le et dites-moi si cela fonctionne!

faraday.request(:authorization, "token", token) fonctionne pour moi.

Ou une autre façon est d'ajouter le middleware faraday.response :logger JUSTE AVANT votre adaptateur, de cette façon il enregistrera le
demande aprĂšs que tous les middlewares aient pris effet et vous devriez certainement le voir.

C'est super sympa de savoir comment déboguer à partir de maintenant. Et en l'utilisant, vous avez tout à fait raison :
Lorsque vous utilisez faraday.request(:authorization, "token", token) , l'en-tĂȘte est Authorization: "token token_value"
Lorsque vous utilisez faraday.request(:token_auth, token) , l'en-tĂȘte est Authorization: "Token token=\"token_value\""

C'est Ă©trange, je viens de tester le code ci-dessus et cela fonctionne comme prĂ©vu pour moi. En voyant la structure Faraday::Request dans le dĂ©bogage, je soupçonne que vous regardez l'objet trop tĂŽt, avant que l'en-tĂȘte ne soit dĂ©fini par le middleware.

Bon, j'ai mis un point d'arrĂȘt dans connection#run_request et Ă  ce moment-lĂ , le middleware n'a pas Ă©tĂ© appelĂ©. J'ajoute un nouveau point d'arrĂȘt dans Faraday::Request::Authorization et maintenant je peux voir comment cela fonctionne.

J'espÚre que cela répond à votre question, mais en bref, vous pouvez utiliser les deux méthodes, alors utilisez celle que vous aimez le plus

Oui et encore merci !

comment se débarrasser de l'avertissement de dépréciation pour le moment?

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

soulÚve toujours l'avertissement pour moi sur 1.7.1 et, comme @mscoutermarsh mentionné, la nouvelle syntaxe n'est pas encore disponible.

@paukul

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

C'est corrigé pour nous. Il ressemble au vÎtre, je ne sais pas pourquoi il vous avertit toujours.

Cette page vous a été utile?
0 / 5 - 0 notes