يحتوي Discourse على نظام لتوليد مفاتيح API لكل مستخدم إذا تم اتباع بروتوكول محدد للغاية. يسهّل هذا الميزة وصول “التطبيقات” إلى مثيلات Discourse دون الحاجة إلى إشراك المشرفين.
وصف عالي المستوى
على مستوى عالٍ:
-
يقوم العميل (تطبيق سطح المكتب، إضافة المتصفح، تطبيق الهاتف المحمول) بتوليد زوج من المفاتيح الخاصة/العامة وعنوان URL للعودة.
-
يعيد العميل التوجيه إلى مسار على Discourse ليمنح Discourse مفتاحه العام.
-
يحصل Discourse على موافقة المستخدم لاستخدام التطبيق.
-
يولد Discourse مفتاح API للمستخدم.
-
يعيد Discourse التوجيه إلى عنوان URL للعودة مع حمولة مشفرة باستخدام مفتاح API العام الذي يحتوي على مفتاح API للمستخدم.
التفاصيل
حالات الاستخدام:
-
تطبيقات سطح المكتب التي تستعلم مواقع Discourse نيابة عن المستخدمين النهائيين للحصول على أعداد الإشعارات عبر مواقع متعددة.
-
تطبيقات الهاتف المحمول التي تستعلم مواقع Discourse نيابة عن المستخدمين النهائيين وتتعامل مع إشعارات الدفع.
-
تطبيقات الويب التي توفر لوحة معلومات للمستخدمين النهائيين حول مواقع Discourse المختلفة.
-
تكاملات مخصصة مع تطبيقات الجهات الخارجية التي تستهلك Discourse كجزء من تطبيق الشركة العام. على سبيل المثال: دمج إشعارات مجتمع Discourse في تطبيق hopscotch.
التصميم:
إعدادات الموقع
-
allow_user_api_key_scopes: نطاقات الوصول المسموح بها لمفاتيح API للمستخدم. يتم تعريف النطاقات هنا. النطاقات المدمجة المتاحة هي:
read(قراءة)،write(كتابة)،message_bus(حافلة الرسائل)،push(دفع)،one_time_password(كلمة مرور لمرة واحدة)،notifications(إشعارات)،session_info(معلومات الجلسة)،bookmarks_calendar(تقويم العلامات المرجعية)،user_status(حالة المستخدم) (قد تسجيل الإضافات نطاقات إضافية). -
user_api_key_allowed_groups: يتحكم في المجموعات المسموح لها بتوليد مفاتيح API للمستخدم (الإعدادات الافتراضية هي المشرفون، والمعتدلون، ومستوى الثقة 0).
-
allowed_user_api_push_urls: قائمة بالمواقع التي يمكن أن تكون أهدافًا لإشعارات الدفع.
-
allowed_user_api_auth_redirects: وجهات إعادة التوجيه المسموح بها بعد توليد مفتاح API للمستخدم.
الإعدادات العامة
- max_user_api_reqs_per_minute: 50
- max_user_api_reqs_per_day: 4000
عناصر واجهة المستخدم
إذا تم منح أي مفاتيح API للمستخدم، يعرض Discourse علامة تبويب تطبيقات في صفحة المستخدم.
ستقوم علامة تبويب تطبيقات بإدراج:
- اسم التطبيق على سبيل المثال: (“Discourse Notifier”)
- تاريخ آخر استخدام
- تاريخ الموافقة
- قائمة بنطاقات الوصول الممنوحة
- زر سحب الوصول حتى تتمكن بسهولة من سحب أي مفاتيح
واجهة تفويض مفتاح API
يجب تفويض كل مفتاح صراحةً من قبل المستخدمين النهائيين في صفحة تشرح بوضوح ما يحدث، على سبيل المثال:
يطلب “Discourse Notifier” الوصول التالي إلى حسابك:
- قراءة الإشعارات ومسحها
- قراءة معلومات جلسة المستخدم
- إنشاء رمز تسجيل دخول لمرة واحدة
[تفويض]
تدفق توليد مفتاح API
يتطلب API طلب GET واحد فقط من جانب المستخدم.
https://sitename.com/user-api-key/new
اعتبارًا من Discourse 2.1، تنتهي صلاحية مفاتيح API للمستخدم هذه تلقائيًا إذا تُركت دون استخدام لفترات طويلة. يتم تعيين إعداد الموقع:
revoke user api keys unused days(أيام عدم استخدام مفاتيح API للمستخدم لسحبها) إلى 180 افتراضيًا.
المعاملات:
- auth_redirect: عنوان URL لإعادة التوجيه إليه مع الرمز المُنشأ.
- application_name: اسم التطبيق الذي يقدم الطلب (سيتم عرضه في علامة تبويب التطبيقات في حساب المستخدم).
- client_id: معرّف فريد للعميل.
- nonce: رقم عشوائي فريد يولده العميل. سيتم إعادته في الحمولة المشفرة حتى يتمكن العميل من التحقق من صحة الاستجابة.
- scopes: قائمة مفصولة بفواصل بنطاقات الوصول المسموح بها للمفتاح، انظر
allow user api key scopes(السماح بنطاقات مفاتيح API للمستخدم) للحصول على القائمة الكاملة للنطاقات المتاحة. - push_url: عنوان URL لإرسال إشعارات الدفع إليه (مطلوب وصالح فقط إذا تم تضمين
pushأوnotificationsفي النطاقات). - public_key: الجزء العام من زوج المفاتيح الذي يولده العميل.
- padding (اختياري): وضع تعبئة RSA المستخدم لتشفير الحمولة. القيم المقبولة هي
pkcs1(الافتراضي) أوoaep. يُوصى بـ OAEP للتطبيقات الجديدة.
بعد استدعاء /user-api-key/new بالمعاملات الصحيحة، قد يحدث أمران:
- إذا لم يكن المستخدم مسجل الدخول، سنعيد التوجيه إلى تسجيل الدخول (بعد تسجيل الدخول سنستأنف التفويض).
- بمجرد تسجيل دخول المستخدم، سيتم عرض واجهة التفويض عليه.
بعد السماح بالتفويض، سيعيد النظام التوجيه إلى عنوان URL المحدد في auth_redirect ويتضمن معلمة payload مشفرة تحتوي على كائن JSON مع مفتاح API للمستخدم المُنشأ (key)، وnonce، وحالة الدفع (push)، وإصدار API (api). إذا تم طلب نطاق one_time_password (كلمة مرور لمرة واحدة)، فسيتم أيضًا تضمين معلمة استعلام oneTimePassword مشفرة منفصلة. لا يتم إعادة client_id لأمان إضافي.
التحقق من إصدار API
يتم إصدار API لمفتاح المستخدم في Discourse. يمكن للعملاء التحقق من إصدار API لموقع Discourse عن طريق تقديم طلب HEAD إلى https://sitename.com/user-api-key/new. ستحتوي الاستجابة على رأس باسم Auth-Api-Version يحتوي على رقم إصدار API للموقع.
استهلاك API
سيكون استهلاك API للعميل مختلفًا بعض الشيء عن API المسؤول الحالي.
يمكن للعميل تحديد رأسين:
User-Api-Key (مطلوب): المفتاح الذي تم إنشاؤه
و
User-Api-Client-Id (اختياري): قم بتزويده لتحديث ‘معرف العميل’ المخزن لهذا المفتاح في قاعدة البيانات.
بمجرد تحديد هذه الرؤوس، يمكن للعميل تنفيذ طلبات ضد API كما هو معتاد.
إنشاء كلمة مرور تسجيل دخول لمرة واحدة
اعتبارًا من الإصدار 4، يتضمن API نطاقًا خاصًا: نطاق one_time_password، والذي يسمح للعملاء باستخدام مفتاح API للمستخدم لإنشاء كلمة مرور لمرة واحدة. إذا تضمن العميل هذا النطاق عند إنشاء مفتاح API باتباع الخطوات أعلاه، فسيتم تضمين oneTimePassword مشفر كمعلمة استعلام منفصلة في إعادة التوجيه إلى العميل.
بديلًا لذلك، يمكن للعميل تقديم طلب GET إلى /user-api-key/otp بالمعاملات التالية:
- auth_redirect
- application_name
- public_key
- padding (اختياري)
ومع رأس User-Api-Key.
سيعيد هذا الطلب التوجيه إلى شاشة في Discourse ستطلب من المستخدم السماح للتطبيق بالوصول إلى الموقع. إذا وافق المستخدم، سيعيد الموقع التوجيه إلى عنوان URL المحدد في auth_redirect ويتضمن معلمة oneTimePassword مشفرة تحتوي على كلمة مرور لمرة واحدة يمكن للعميل استخدامها لتسجيل الدخول إلى الموقع عن طريق طلب https://sitename.com/session/otp/ONE-TIME-PASSWORD. (كلمة المرور لمرة واحدة صالحة لمدة 10 دقائق فقط.)
سحب مفاتيح API
لإلغاء مفتاح API، قدم طلب POST مع رأس User-Api-Key وبدون معاملات إلى /user-api-key/revoke.
آخر مراجعة بواسطة @SaraDev في 2022-07-13T00:00:00Z
