Faraday: PERINGATAN: `Faraday::Connection#basic_auth` tidak digunakan lagi

Dibuat pada 31 Agu 2021  ·  9Komentar  ·  Sumber: lostisland/faraday

Info dasar

  • Versi Faraday: 1.7.1
  • Versi Ruby: 3.0.2

Deskripsi masalah

Melihat peringatan penghentian, kode yang diperbarui agar sesuai dengan instruksi autentikasi dasar yang didokumentasikan . Kode yang didokumentasikan melempar sejumlah kesalahan argumen.

Tidak yakin apakah dokumennya salah atau ada masalah dengan permata.

Langkah-langkah untuk mereproduksi

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'

Semua 9 komentar

Dokumennya salah :) Saya baru saja membuka PR untuk memperbaikinya.

Sementara itu Anda perlu menggunakannya seperti ini:

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

Halo! Konteks untuk situs web dokumentasi yang tidak berima dengan pesan penghentian 1.x adalah: "semua dokumen situs web adalah 2.0 yang akan datang". Versi di mana cara lama dihapus.

Konteksnya hanya pernah disebutkan hanya di README - ini adalah kelemahannya, yang kami ingin mendapatkan bantuan nyata di bagian depan situs web.

Tautan ke bagian itu:

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

@peterberkenbosch benar, itu cara yang tepat untuk menggunakan middleware di Faraday 1.x, sementara dokumentasi menunjukkan penggunaan yang benar untuk v2.0 mendatang.

Maaf atas kebingungannya, ini bukan pertama kalinya masalah seperti ini diangkat. Saya akan mencari solusi cepat untuk membuat segalanya lebih jelas

Terima kasih! Semua baik sekarang. ❤️

Halo @iMacTia ,

Saya masih memiliki masalah tentang masalah ini.
Saya menggunakan Faraday 1.7.1 dan Ruby 2.7.2.

Saya awalnya membuat koneksi seperti ini

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

Berdasarkan pembicaraan di atas, saya kira jika saya beralih menggunakan faraday.request(:token_auth, token), itu akan membantu menambahkan header dalam permintaan, jadi saya beralih ke

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

Klien di atas digunakan dengan cara ini dan saya mendapatkan kesalahan "errors"=>["Authentication Required"]

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

Saya juga men-debug kode dan entah bagaimana, middleware tidak berlaku dalam permintaan dan tidak ada Authorization di header, ini adalah satu dump objek permintaan

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

Apakah saya menggunakannya dengan cara yang salah atau haruskah saya membuat bug baru?

BTW, apa perbedaan antara faraday.headers["Authorization"] = "token #{token}" dan faraday.request(:token_auth, token) . Berdasarkan pengetahuan Ruby pemula saya dan membaca kode sumber, token_auth mencoba mengatur header, yang setara dengan faraday.headers[]= . Lalu di doc, kenapa kami menyarankan untuk menggunakan middleware daripada langsung mengatur header?

Hai @xiaoxipang , banyak pertanyaan bagus di sana, biarkan saya melihat apakah saya bisa menjawab semuanya.

Apakah saya menggunakannya dengan cara yang salah atau haruskah saya membuat bug baru?

Anda menggunakannya dengan benar, tetapi saya menduga output dari middleware tidak persis seperti yang diharapkan server.
"Autentikasi token" ini terlihat seperti standar lama yang tidak digunakan lagi dan telah digantikan oleh token Bearer dan mekanisme lainnya. Output header dalam contoh Anda adalah Authorization: Token token=token , perhatikan awalan token= , yang saya duga tidak diharapkan oleh server Anda. Untuk memperbaikinya, Anda dapat melakukan hal berikut:

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

Ini akan mengatur tajuk dengan benar ke Authorization: Token token (tanpa awalan).
Silakan mencobanya dan beri tahu saya jika berhasil!

Saya juga men-debug kode dan entah bagaimana, middleware tidak berlaku dalam permintaan dan tidak ada Otorisasi di header, ini adalah satu permintaan objek dump

Itu aneh, saya baru saja menguji kode di atas dan berfungsi seperti yang diharapkan untuk saya. Melihat struct Faraday::Request dalam debugging, saya menduga Anda mungkin melihat objek terlalu dini, sebelum header disetel oleh middleware.
Jika Anda menjalankan permintaan dan memeriksa responsnya, Anda pasti akan melihatnya di sana:

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

Atau cara lain adalah dengan menambahkan middleware faraday.response :logger SEBELUM adaptor Anda, cara ini akan mencatat permintaan setelah semua middleware berlaku dan Anda pasti akan melihatnya.

BTW, apa perbedaan antara faraday.headers["Authorization"] = "token #{token}" dan faraday.request(:token_auth, token). Berdasarkan pengetahuan Ruby pemula saya dan membaca kode sumber, token_auth mencoba mengatur header, yang setara dengan faraday.headers[]=. Lalu di doc, kenapa kami menyarankan untuk menggunakan middleware daripada langsung mengatur header?

Alasan utama saran itu adalah bahwa middleware biasanya menyediakan fungsionalitas yang lebih besar.
Misalnya, middleware token_auth memungkinkan Anda untuk mengatur properti token juga dan memformatnya secara otomatis:

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

Dengan cara yang sama, middleware basic_auth secara otomatis melakukan pengkodean Base64 dari pasangan pengguna/pass Anda.

Saya setuju middleware faraday.request(:authorization, 'Token', token) atas tidak melakukan lebih dari mengatur header secara manual, tetapi misalnya di Faraday v2 middleware itu menerima lambda/proc untuk argumen token dan secara otomatis menyelesaikannya pada masing-masing meminta. Itu memungkinkan Anda untuk memiliki kelas TokenStorage dan secara dinamis mengubah token di antara permintaan yang berbeda. Dengan pendekatan lain, Anda harus menyuntikkan header secara manual pada setiap permintaan atau membuat ulang koneksi setiap saat.

Saya harap ini menjawab pertanyaan Anda, tetapi singkatnya Anda baik menggunakan kedua metode, jadi gunakan yang paling Anda sukai

@iMacTia Terima kasih banyak atas bantuan dan penjelasannya yang detail!

Silakan mencobanya dan beri tahu saya jika berhasil!

faraday.request(:authorization, "token", token) bekerja untuk saya.

Atau cara lain adalah dengan menambahkan faraday.response :logger middleware SEBELUM adaptor Anda, cara ini akan mencatat
permintaan setelah semua middleware berlaku dan Anda pasti harus melihatnya.

Sangat menyenangkan mengetahui cara men-debug mulai sekarang. Dan dengan menggunakan itu, Anda sepenuhnya benar:
Saat menggunakan faraday.request(:authorization, "token", token) , tajuknya adalah Authorization: "token token_value"
Saat menggunakan faraday.request(:token_auth, token) , tajuknya adalah Authorization: "Token token=\"token_value\""

Itu aneh, saya baru saja menguji kode di atas dan berfungsi seperti yang diharapkan untuk saya. Melihat struct Faraday::Request dalam debugging Saya menduga Anda mungkin melihat objek terlalu dini, sebelum header diatur oleh middleware.

Benar, saya meletakkan breakpoint di connection#run_request dan pada saat itu, middleware belum dipanggil. Saya menambahkan break point baru di Faraday::Request::Authorization dan sekarang saya dapat melihat cara kerjanya.

Saya harap ini menjawab pertanyaan Anda, tetapi singkatnya Anda baik menggunakan kedua metode, jadi gunakan yang paling Anda sukai

Ya dan terima kasih sekali lagi!

bagaimana cara menghilangkan peringatan penghentian untuk saat ini?

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

masih memunculkan peringatan untuk saya di 1.7.1 dan, seperti yang disebutkan @mscoutermarsh , sintaks baru belum tersedia.

@paukul

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

Memperbaikinya untuk kita. Terlihat sama dengan milik Anda, tidak yakin mengapa itu masih memberi Anda peringatan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat