Faraday: تحذير: `Faraday :: Connection # basic_auth` غير مفعّلة

تم إنشاؤها على ٣١ أغسطس ٢٠٢١  ·  9تعليقات  ·  مصدر: lostisland/faraday

معلومات أساسية

  • إصدار فاراداي: 1.7.1
  • إصدار روبي: 3.0.2

وصف المشكلة

شاهد تحذير الإيقاف ، رمز محدث لمطابقة إرشادات المصادقة الأساسية الموثقة . يطرح الرمز الموثق عددًا من خطأ الوسيطات.

لست متأكدًا مما إذا كانت المستندات خاطئة أم أنها مشكلة في الجوهرة.

خطوات التكاثر

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'

ال 9 كومينتر

المستندات خاطئة :) لقد فتحت للتو علاقات عامة لإصلاح ذلك.

في هذه الأثناء تحتاج إلى استخدامه على النحو التالي:

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

أهلا! سياق موقع التوثيق الإلكتروني الذي لا يتناغم مع رسالة الإهمال 1.x هو: "جميع مستندات موقع الويب هي الإصدار 2.0 القادم". هذا الإصدار حيث تمت إزالة الطريقة القديمة.

لم يُذكر السياق إلا في README فقط - وهذه نقطة ضعف نود الحصول على مساعدة ملموسة بشأنها على واجهة موقع الويب.

رابط لهذا الجزء:

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

peterberkenbosch صحيح ، هذه هي الطريقة الصحيحة لاستخدام البرمجيات الوسيطة في Faraday 1.x ، بينما توضح الوثائق الاستخدام الصحيح للإصدار 2.0 القادم.

نأسف على الالتباس ، فهذه ليست المرة الأولى التي تثار فيها مثل هذه المشكلة. سأبحث عن حل سريع لتوضيح الأمور

شكرا لك! كل خير الآن. ❤️

مرحبا iMacTia ،

ما زلت أواجه مشكلة في هذه المسألة.
أنا أستخدم Faraday 1.7.1 و Ruby 2.7.2.

لقد قمت في الأصل بإنشاء اتصال مثل هذا

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

بناءً على الحديث أعلاه ، أعتقد أنه إذا قمت بالتبديل لاستخدام faraday.request (: token_auth ، token) ، فمن المفترض أن يساعد ذلك في إضافة رأس في الطلب ، لذلك قمت بالتبديل إلى

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

يتم استخدام العميل أعلاه بهذه الطريقة وقد تلقيت خطأ "errors"=>["Authentication Required"]

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

لقد قمت أيضًا بتصحيح الكود وبطريقة ما ، لم تدخل البرامج الوسيطة حيز التنفيذ في الطلب ولا يوجد Authorization في الرأس ، وهنا يوجد تفريغ كائن طلب واحد

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

هل استخدمته بطريقة خاطئة أم يجب أن أقوم بإنشاء خطأ جديد؟

راجع للشغل ، ما هو الفرق بين faraday.headers["Authorization"] = "token #{token}" و faraday.request(:token_auth, token) . استنادًا إلى معرفتي الجديدة بالياقوت وقراءة الكود المصدري ، يحاول token_auth تعيين العنوان ، وهو ما يعادل faraday.headers[]= . ثم في المستند ، لماذا نوصي باستخدام البرامج الوسيطة بدلاً من تعيين الرأس مباشرةً؟

مرحبًا xiaoxipang ، هناك الكثير من الأسئلة الجيدة هناك ، دعني أرى ما إذا كان بإمكاني الإجابة عليها جميعًا.

هل استخدمته بطريقة خاطئة أم يجب أن أقوم بإنشاء خطأ جديد؟

لقد استخدمتها بشكل صحيح ، لكنني أظن أن ناتج البرنامج الوسيط ليس بالضبط ما يتوقعه الخادم.
تبدو "المصادقة المميزة" هذه كمعيار قديم جدًا لم يعد مستخدمًا بعد الآن وتم استبداله برمز Bearer المميز والآليات الأخرى. سيكون ناتج الرأس في المثال الخاص بك هو Authorization: Token token=token ، لاحظ البادئة token= ، والتي أظن أن خادمك لا يتوقعها. لإصلاح ذلك ، يمكنك بدلاً من ذلك القيام بما يلي:

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

سيؤدي هذا إلى تعيين الرأس بشكل صحيح على Authorization: Token token (بدون بادئة).
من فضلك جربها واسمحوا لي أن أعرف إذا كان يعمل!

لقد قمت أيضًا بتصحيح الكود وبطريقة ما ، لم تسري البرامج الوسيطة في الطلب ولا يوجد تفويض في الرأس ، وهنا تفريغ كائن طلب واحد

هذا غريب ، لقد اختبرت الكود أعلاه وهو يعمل كما هو متوقع بالنسبة لي. عند رؤية struct Faraday::Request في تصحيح الأخطاء ، أظن أنك قد تنظر إلى الكائن في وقت مبكر جدًا ، قبل أن يتم تعيين الرأس بواسطة البرنامج الوسيط.
إذا قمت بتشغيل طلب والتحقق من الاستجابة ، فمن المؤكد أنك ستراه هناك:

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

أو طريقة أخرى تتمثل في إضافة البرنامج الوسيط faraday.response :logger فقط قبل المحول الخاص بك ، وبهذه الطريقة سيتم تسجيل الطلب بعد أن تصبح جميع البرامج الوسيطة سارية المفعول ويجب أن تراها بالتأكيد.

راجع للشغل ، ما هو الفرق بين faraday.headers ["Authorization"] = "token # {token}" و faraday.request (: token_auth، token). استنادًا إلى معرفتي الجديدة بالياقوت وقراءة شفرة المصدر ، يحاول token_auth تعيين الرأس ، وهو ما يعادل faraday.headers [] =. ثم في المستند ، لماذا نوصي باستخدام البرامج الوسيطة بدلاً من تعيين الرأس مباشرةً؟

السبب الرئيسي لهذا الاقتراح هو أن البرامج الوسيطة توفر عادةً وظائف أكبر.
على سبيل المثال ، تسمح لك البرامج الوسيطة token_auth بتعيين خصائص الرمز أيضًا وتنسيقها تلقائيًا:

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

بطريقة مماثلة ، تقوم البرامج الوسيطة basic_auth تلقائيًا بترميز Base64 لزوج المستخدم / المرور.

أوافق على أن البرنامج الوسيط faraday.request(:authorization, 'Token', token) أعلاه لا يقوم بأكثر من تعيين الرأس يدويًا ، ولكن على سبيل المثال في Faraday v2 ، تقبل البرامج الوسيطة lambda / proc للمُتغير token ويحل ذلك تلقائيًا على كل طلب. يتيح لك ذلك الحصول على فئة TokenStorage وتغيير الرمز المميز ديناميكيًا بين الطلبات المختلفة. باستخدام الطريقة الأخرى ، ستحتاج إلى إدخال العنوان يدويًا في كل طلب أو إعادة إنشاء الاتصال في كل مرة.

أتمنى أن يجيب هذا على سؤالك ، لكن باختصار ، من الجيد استخدام كلتا الطريقتين ، لذا استخدم الطريقة التي تفضلها 😄

iMacTia شكرًا جزيلاً لك على المساعدة والشرح التفصيلي!

من فضلك جربها واسمحوا لي أن أعرف إذا كان يعمل!

faraday.request(:authorization, "token", token) يعمل لدي.

أو طريقة أخرى هي إضافة faraday.response: برنامج وسيط المسجل قبل المحول فقط ، وبهذه الطريقة سيسجل
طلب بعد أن تصبح جميع البرامج الوسيطة سارية المفعول ويجب أن تراها بالتأكيد.

من الجيد جدًا معرفة كيفية التصحيح من الآن فصاعدًا. وباستخدام ذلك ، فأنت على صواب تام:
عند استخدام faraday.request(:authorization, "token", token) ، يكون رأس الصفحة هو Authorization: "token token_value"
عند استخدام faraday.request(:token_auth, token) ، يكون رأس الصفحة هو Authorization: "Token token=\"token_value\""

هذا غريب ، لقد اختبرت الكود أعلاه وهو يعمل كما هو متوقع بالنسبة لي. عند رؤية البنية Faraday :: Request في تصحيح الأخطاء ، أظن أنك قد تنظر إلى الكائن في وقت مبكر جدًا ، قبل أن يتم تعيين الرأس بواسطة البرامج الوسيطة.

حسنًا ، لقد وضعت نقطة توقف في connection#run_request وفي تلك اللحظة ، لم يتم استدعاء البرمجيات الوسيطة. أقوم بإضافة نقطة فاصل جديدة في Faraday :: Request :: Authorization والآن يمكنني رؤية كيف يعمل.

آمل أن يجيب هذا على سؤالك ، ولكن باختصار ، من الجيد استخدام كلتا الطريقتين ، لذا استخدم الطريقة التي تفضلها أكثر

نعم وشكرا لك مرة أخرى!

كيف تتخلص من تحذير الإيقاف في الوقت الحالي؟

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

لا يزال يرفع التحذير لي على 1.7.1 وكما ذكر mscoutermarsh ، فإن بناء الجملة الجديد غير متاح بعد.

تضمين التغريدة

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

تم إصلاحه لنا. يبدو مشابهًا لك ، لست متأكدًا من سبب استمراره في إعطائك التحذير.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

JasonBarnabe picture JasonBarnabe  ·  4تعليقات

Lewiscowles1986 picture Lewiscowles1986  ·  4تعليقات

jordansissel picture jordansissel  ·  5تعليقات

mvastola picture mvastola  ·  4تعليقات

QuinnWilton picture QuinnWilton  ·  4تعليقات