Rake api_key:get معطلة

حسنًا، فشل التثبيت (فإن سكريبت التثبيت الخاص بي يحصل على مفتاح API ليتمكن من تعيين mailgun_api_key). لقد تحققت من ذلك أيضًا في بيئة التطوير المحلية لدي.

$ rake api_key:get
rake aborted!
NoMethodError: undefined method `create_master_key' for ApiKey (call 'ApiKey.connection' to establish a connection):Class
Did you mean?  create_with
/home/pfaffman/src/discourse/lib/tasks/api.rake:5:in `block in <main>'
Tasks: TOP => api_key:get
(See full trace by running task with --trace)

إنه هذا الالتزام. @david

إليك طلب السحب (PR): FIX: create_master_key got renamed by pfaffman · Pull Request #8325 · discourse/discourse · GitHub

شكرًا لك @pfaffman، لقد تركت تعليقًا على طلب السحب (PR)

فقط للتأكد - هل هذا هو سكربت التثبيت الشخصي الخاص بك، وليس سكربت التثبيت القياسي؟

نعم! لم يتسبب هذا في تعطيل التثبيت العادي، بل فقط الجزء من عملية ما بعد التثبيت الذي يحتاج إلى مفتاح API لتعيين mailgun_api_key.

أعتقد أن قلة قليلة من الناس يستخدمون مهمة rake هذه.

:+1: بدافع الفضول، هل تقوم بمسح مفتاح الـ API بعد الانتهاء؟ قد تكون لاحظت أنني أجريت العديد من التغييرات مؤخرًا لضمان تتبع أفضل لمفاتيح الـ API. نحن نحاول تقليل وجود مفاتيح API “غير مستخدمة” تترك كثغرات أمنية محتملة.

إذا كان هذا يعمل على الخادم، فربما يمكنك استخدام Ruby لتعيين إعداد الموقع، بدلاً من إنشاء مفتاح API واستخدامه؟

أوه! أعتقد أنه من الأفضل عدم تغيير المفتاح إذا كان موجودًا بالفعل، أو إنشاء مهمة create_if_not_exists. من المفيد جدًا القدرة على الحصول على المفتاح الحالي عبر مهمة Rake دون الحاجة إلى تغييره وكسر أي شيء يستخدمه.

في بعض الأماكن في أدوات Ansible الخاصة بي، إذا لم يكن لدي مفتاح API، فأنا أستدعي مهمة Rake هذه للحصول على المفتاح الحالي، مثل:

- name: Get api key
  block:
    - shell: docker exec -w /var/www/discourse -i {{ discourse_yml }}  rake api_key:get
      register: get_api_key

    - set_fact:
        discourse_api_key: "{{ get_api_key.stdout }}"

  when: discourse_api_key is not defined

أعتقد أن الوقت الوحيد الذي يكون فيه من الضروري حقًا الحصول عليه بهذه الطريقة هو عند إجراء تثبيت نظيف. (بالنسبة للمواقع الموجودة، لدي مفتاح API في المتغيرات الخاصة بذلك الموقع.)

أفترض أنه مع الطريقة الجديدة التي يتم بها التعامل مع المفاتيح، يمكنني حذف المفتاح عندما أنتهي، أو، على سبيل المثال، تغيير إعدادات الموقع بطريقة ما عن طريق تشغيل سكريبت Rails داخل الحاوية؟

التغيير الوحيد الذي قمت به هو أنه يمكنك الآن امتلاك مفاتيح متعددة لكل مستخدم (أو عدة “مفاتيح رئيسية”). وهذا يعني أنه يمكن منح كل تكامل مفتاحه الخاص، ويمكن تدقيقه أو إلغاؤه أو حذفه بشكل منفصل. لذا، في حالتك، يمكنك إنشاء مفتاح مع الوصف “أدوات إعداد pfaffman”. وبذلك يعرف مسؤولو الموقع الغرض منه، ويمكنهم إلغاؤه أو حذفه عند عدم الحاجة إليه بعد الآن.

أما فيما يتعلق بكيفية ترجمة ذلك إلى مهمة rake… لست متأكدًا. ربما يمكننا وجود مهمة باسم api:get_or_create "وصف مفتاحي" :thinking:

هل سيكون ذلك مناسبًا لحالتك @pfaffman؟

بالتأكيد! أعتقد أن ذلك سيكون رائعًا للغاية.

كيف يبدو هذا؟

rake api_key:get_or_create_master["Onboarding Key"]

إذا لم يكن هناك اعتراضات، سأقوم بدمجه خلال بضع ساعات.

يبدو جيدًا من جانبي! وكان دليلي لا يزال مفتوحًا في المحرر، لذا أنا ملتزم بالفعل. :slight_smile:

تم الدمج في

آسف يا @pfaffman، لكنني أخشى أنني سأضطر إلى إزالة مهمة rake الجديدة هذه في طلب سحب (PR) قادم. سنقوم بتجزئة مفاتيح API في قاعدة البيانات، لذا سيكون من المستحيل جوهريًا استعادة مفتاح موجود.

لقد استبدلت مهمة get_or_create_master بمهمة create_master أبسط، والتي ستقوم بإنشاء مفتاح جديد بشكل قاطع. إذا كنت ترغب في امتلاك مفتاح واحد فقط، فستحتاج إلى تتبع المفتاح في نظامك الخاص.

أجل، توقعت ذلك تقريبًا. الأنظمة الأخرى تعرض مفتاح الـ API مرة واحدة فقط، لذا…

شكرًا لك على التنبيه!

لا أستطيع التحديد بسرعة. (انتظر، كيف لا يوجد ملف schema.rb في مجلد db؟)

إذا قمت بتشغيل الأمر rake api_key:create_master['اسم معين'] عدة مرات بنفس الاسم، هل سيفشل؟ أي هل يجب أن يكون هذا الاسم فريدًا؟

لا يجب أن تكون الأوصاف فريدة، لا. ومع ذلك، قد يصبح الأمر محيرًا للغاية إذا قمت بإنشاء العديد من المفاتيح التي تبدو متشابهة.

نحن لا نلتزم بملف schema.rb. أفضل مكان للبحث هو التعليقات التوضيحية في أسفل كل ملف تحت /app/models

انتظر. ماذا؟! منذ متى؟ مهما كان الالتزام الموجود في مصدر discourse الحالي على القرص الصلب الخاص بي، لا يزال يحتوي على schema.rb. إنه مفيد حقًا، حقًا، أن تكون قادرًا على معرفة النموذج الذي قد تبحث عنه. القدرة على فتح ملف واحد والبحث عن شيء ما (على سبيل المثال، لمعرفة النموذج الذي قد تبحث عنه) أسهل بكثير من البحث في أكثر من 200 ملف في app/models. لا توجد حتى طريقة جيدة للقيام بـ grep على المخطط فقط في نهاية النماذج.

إذا كنت لا تعرف النموذج الذي تبحث عنه، فكيف يمكنك العثور عليه؟ مثل وجود العديد من الجداول المتعلقة بـ “auth”، وليس جميعها تبدأ بـ auth، كيف يمكنك البدء في معرفة مكان البحث؟

منذ البداية، فهي موجودة في ملف .gitignore. لكنها تُنشأ عند تشغيل db:migrate، ولهذا السبب تظهر محليًا.

اسم الجدول يتطابق دائمًا مع اسم النموذج، لذا أستخدم أسماء الملفات فقط :man_shrugging:

آه، هذا يوضح ما أعرفه. :wink شكرًا لك على الشرح.

في بعض الأحيان لا أستطيع تخمين اسم الجدول أو النموذج، لذا فإن وجود جميع الحقول في مكان واحد يُعدّ مساعدة كبيرة.