Faraday: WARNUNG: `Faraday::Connection#basic_auth` ist veraltet

Erstellt am 31. Aug. 2021  ·  9Kommentare  ·  Quelle: lostisland/faraday

Basisinformation

  • Faraday-Version: 1.7.1
  • Ruby-Version: 3.0.2

Fehlerbeschreibung

Sah die Veraltungswarnung, aktualisierter Code, um den dokumentierten grundlegenden Authentifizierungsanweisungen zu entsprechen . Der dokumentierte Code löst eine Reihe von Argumenten aus.

Ich bin mir nicht sicher, ob die Dokumente falsch sind oder ob es ein Problem mit dem Edelstein ist.

Schritte zum Reproduzieren

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'

Alle 9 Kommentare

Die Dokumente sind falsch :) Ich habe gerade eine PR geöffnet, um das zu beheben.

In der Zwischenzeit müssen Sie es so verwenden:

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

Hallo! Der Kontext für die Dokumentationswebsite, die sich nicht auf die 1.x-Deprecation-Meldung reimt, lautet: "Alle Websitedokumente sind die kommende 2.0". Diese Version, bei der der alte Weg entfernt wird.

Der Kontext wird immer nur in der README erwähnt - das ist eine Schwäche, bei der wir gerne konkrete Hilfe an der Website-Front bekommen würden.

Link zu diesem Teil:

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

@peterberkenbosch ist richtig, das ist der richtige Weg, um die Middleware in Faraday 1.x zu verwenden, während die Dokumentation die korrekte Verwendung für die kommende v2.0 zeigt.

Entschuldigung für die Verwirrung, dies ist nicht das erste Mal, dass ein solches Problem angesprochen wird. Ich werde nach einer schnellen Lösung suchen, um die Dinge klarer zu machen

Dankeschön! Alles gut jetzt. ️

Hallo @iMacTia ,

Ich habe immer noch ein Problem zu diesem Thema.
Ich verwende Faraday 1.7.1 und Ruby 2.7.2.

Ich habe ursprünglich eine solche Verbindung erstellt

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

Basierend auf dem obigen Gespräch denke ich, wenn ich zur Verwendung von faraday.request (:token_auth, token) wechsle, sollte dies helfen, den Header in die Anfrage einzufügen, also wechselte ich zu

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

Der obige Client wird auf diese Weise verwendet und ich habe den Fehler "errors"=>["Authentication Required"]

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

Ich habe auch den Code debuggt und irgendwie hat die Middleware in der Anfrage nicht wirksam und kein Authorization im Header, hier ist ein Anfrageobjekt-Dump

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

Habe ich es falsch verwendet oder sollte ich einen neuen Fehler erstellen?

Übrigens, was ist der Unterschied zwischen faraday.headers["Authorization"] = "token #{token}" und faraday.request(:token_auth, token) . Basierend auf meinem Ruby-Neuling-Wissen und dem Lesen des Quellcodes versucht token_auth , den Header zu setzen, der faraday.headers[]= . Warum empfehlen wir dann im Dokument, Middleware zu verwenden, anstatt den Header direkt festzulegen?

Hallo @xiaoxipang , viele gute Fragen sind

Habe ich es falsch verwendet oder sollte ich einen neuen Fehler erstellen?

Sie haben es richtig verwendet, aber ich vermute, dass die Ausgabe der Middleware nicht genau das ist, was der Server erwartet.
Diese "Token-Authentifizierung" sieht aus wie ein ziemlich alter Standard, der nicht mehr verwendet wird und durch Bearer-Token und andere Mechanismen ersetzt wurde. Die Header-Ausgabe in Ihrem Beispiel wäre Authorization: Token token=token , beachten Sie das Präfix token= , von dem ich vermute, dass Ihr Server nicht erwartet. Um dies zu beheben, können Sie stattdessen Folgendes tun:

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

Dadurch wird der Header korrekt auf Authorization: Token token (kein Präfix) gesetzt.
Bitte probiere es aus und lass es mich wissen, ob es funktioniert!

Ich habe auch den Code debuggt und irgendwie hat die Middleware in der Anfrage nicht wirksam und keine Autorisierung im Header, hier ist ein Anfrageobjekt-Dump

Das ist seltsam, ich habe gerade den obigen Code getestet und er funktioniert wie erwartet für mich. Wenn ich die struct Faraday::Request beim Debuggen sehe, vermute ich, dass Sie das Objekt zu früh betrachten, bevor der Header von der Middleware gesetzt wird.
Wenn Sie eine Anfrage ausführen und die Antwort überprüfen, sollten Sie sie dort auf jeden Fall sehen:

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

Oder Sie fügen die faraday.response :logger Middleware NUR VOR Ihrem Adapter hinzu. Auf diese Weise wird die Anforderung protokolliert, nachdem die gesamte Middleware wirksam geworden ist und Sie sie auf jeden Fall sehen sollten.

Übrigens, was ist der Unterschied zwischen faraday.headers["Authorization"] = "token #{token}" und faraday.request(:token_auth, token). Basierend auf meinem Ruby-Neuling-Wissen und dem Lesen des Quellcodes versucht token_auth, den Header zu setzen, der faraday.headers[]= entspricht. Warum empfehlen wir dann im Dokument, Middleware zu verwenden, anstatt den Header direkt festzulegen?

Der Hauptgrund für diesen Vorschlag ist, dass Middleware normalerweise eine größere Funktionalität bietet.
Mit der Middleware token_auth können Sie beispielsweise auch Token-Eigenschaften festlegen und diese automatisch formatieren:

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

Auf ähnliche Weise führt die basic_auth Middleware automatisch eine Base64-Kodierung Ihres Benutzer/Pass-Paares durch.

Ich stimme zu, dass die obige faraday.request(:authorization, 'Token', token) Middleware nicht viel mehr tut, als den Header manuell festzulegen, aber zum Beispiel in Faraday v2 akzeptiert diese Middleware ein Lambda/Proc für das token Argument und löst dies automatisch bei jedem auf Anfrage. Dadurch können Sie eine TokenStorage Klasse haben und das Token dynamisch zwischen verschiedenen Anforderungen ändern. Bei dem anderen Ansatz müssten Sie den Header bei jeder Anforderung manuell einfügen oder die Verbindung jedes Mal neu erstellen.

Ich hoffe, dies beantwortet Ihre Frage, aber kurz gesagt, Sie können beide Methoden verwenden, also verwenden Sie die, die Ihnen am besten gefällt 😄

@iMacTia Vielen Dank für die Hilfe und die ausführliche Erklärung!

Bitte probiere es aus und lass es mich wissen, ob es funktioniert!

faraday.request(:authorization, "token", token) funktioniert bei mir.

Oder Sie fügen die Middleware faraday.response :logger NUR VOR Ihrem Adapter hinzu
anfordern, nachdem die gesamte Middleware wirksam geworden ist, und Sie sollten es auf jeden Fall sehen.

Es ist super schön zu wissen, wie man von nun an debuggt. Und wenn Sie das verwenden, liegen Sie völlig richtig:
Bei Verwendung von faraday.request(:authorization, "token", token) lautet der Header Authorization: "token token_value"
Bei Verwendung von faraday.request(:token_auth, token) lautet der Header Authorization: "Token token=\"token_value\""

Das ist seltsam, ich habe gerade den obigen Code getestet und er funktioniert wie erwartet für mich. Wenn ich die Struktur Faraday::Request beim Debuggen sehe, vermute ich, dass Sie sich das Objekt zu früh ansehen, bevor der Header von der Middleware gesetzt wird.

Richtig, ich habe einen Breakpoint in connection#run_request und in diesem Moment wurde die Middleware nicht aufgerufen. Ich füge in Faraday::Request::Authorization einen neuen Breakpoint hinzu und jetzt kann ich sehen, wie es funktioniert.

Ich hoffe, dies beantwortet Ihre Frage, aber kurz gesagt, Sie können beide Methoden verwenden, also verwenden Sie die, die Ihnen am besten gefällt

Ja und nochmals vielen Dank!

Wie kann man die Veraltungswarnung vorerst loswerden?

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

löst für mich immer noch die Warnung auf 1.7.1 aus und, wie @mscoutermarsh erwähnte, ist die neue Syntax noch nicht verfügbar.

@paukul

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

Habe es für uns behoben. Sieht genauso aus wie Ihres, ich bin mir nicht sicher, warum es Sie immer noch warnt.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

QuinnWilton picture QuinnWilton  ·  4Kommentare

jedeleh picture jedeleh  ·  3Kommentare

amrrbakry picture amrrbakry  ·  4Kommentare

luizkowalski picture luizkowalski  ·  3Kommentare

ioquatix picture ioquatix  ·  4Kommentare