العربية
  • oauth
  • jwt
  • api
  • الأمان
  • المصادقة
  • التفويض
  • من آلة إلى آلة

تأمين موارد API للاتصال من آلة إلى آلة

تعلم كيفية الاستفادة من OAuth 2.0 و JWT لتأمين موارد API للاتصال من آلة إلى آلة.

Gao
Gao
Founder

عند بناء مشروع يتضمن خدمات متعددة، فإن أمان موارد API هو مصدر قلق بالغ الأهمية. في هذه المقالة، سأوضح لك كيفية الاستفادة من OAuth 2.0 و JWT لتأمين الاتصال بين الخدمات (من آلة إلى آلة)، وكيفية تطبيق التحكم في الوصول القائم على الأدوار (RBAC) للالتزام بمبدأ الحد الأدنى من الامتياز.

البدء

للمتابعة، أفترض أن لديك المتطلبات السابقة التالية:

  • حساب Logto Cloud، أو نسخة مستضافة ذاتياً من Logto
  • على الأقل خدمتين تحتاجان للتواصل مع بعضهما البعض

لأغراض العرض التوضيحي، لنفترض أن لدينا الخدمات التالية:

  • خدمة عربة التسوق التي توفر APIs لإدارة عربات التسوق
    • نقطة النهاية: https://cart.example.com/api
  • خدمة الدفع التي توفر APIs لمعالجة المدفوعات
    • نقطة النهاية: https://payment.example.com/api

تدفق المصادقة

الآن، تحتاج خدمة العربة إلى الاتصال بخدمة الدفع لمعالجة المدفوعات. تدفق المصادقة كالتالي:

بعض المفاهيم الرئيسية في الرسم البياني أعلاه:

  • JWT (RFC 7519): رمز ويب JSON. انظر المقال السابق لدينا للحصول على مقدمة عن JWT.
  • JWK (RFC 7517): مفتاح ويب JSON يُستخدم للتحقق من توقيع JWT. مجموعة JWK هي مجموعة من JWKs.
  • منحة "client_credentials" (RFC 6749): نوع منحة في OAuth 2.0. يستخدم بيانات اعتماد العميل للحصول على رمز الوصول. سنشرح التفاصيل في الأقسام التالية.

كل مشارك في الرسم البياني أعلاه له دور يلعبه في تدفق المصادقة:

  • خدمة العربة: العميل الذي يحتاج إلى الاتصال بخدمة الدفع. على الرغم من أنها خدمة، إلا أنها لا تزال عميل في سياق OAuth 2.0، ونطلق على هذه العملاء "تطبيقات من آلة إلى آلة" في Logto.
  • Logto: خادم تفويض OAuth 2.0 الذي يصدر رموز الوصول.
  • خدمة الدفع: مورد API الذي يوفر APIs لمعالجة المدفوعات.

لنمر عبر تدفق المصادقة خطوة بخطوة.

الإعداد الأولي

لإجراء تدفق المصادقة، نحتاج إلى إنشاء تطبيق من آلة إلى آلة (خدمة العربة) ومورد API (خدمة الدفع) في Logto.

إنشاء مورد API

بالنظر إلى أن خدمة العربة تحتاج إلى أن تكون على علم بمورد API لخدمة الدفع عند إجراء المصادقة، نحتاج إلى إنشاء مورد API أولاً. انتقل إلى Logto Console، انقر على موارد API في الشريط الجانبي الأيسر، وانقر على إنشاء مورد API. في الحوار المفتوح، نقدم بعض الدروس التعليمية لمساعدتك على البدء. يمكنك أيضًا النقر على متابعة بدون درس تعليمي لتخطيه.

أدخل اسم API والمعرف، على سبيل المثال، خدمة الدفع و https://payment.example.com/api، ثم انقر على إنشاء مورد API.

بعد إنشاء مورد API، سيتم تحويلك إلى صفحة التفاصيل. يمكننا تركها كما هي الآن.

إنشاء تطبيق من آلة إلى آلة

انقر على التطبيقات في الشريط الجانبي الأيسر، وانقر على إنشاء تطبيق. في الحوار المفتوح، ابحث عن بطاقة من آلة إلى آلة، ثم انقر على البدء في البناء.

أدخل اسم التطبيق، على سبيل المثال، خدمة العربة، وانقر على إنشاء تطبيق. سيظهر دليل تفاعلي لمساعدتك على إعداد التطبيق. يمكنك اتباع الدليل لفهم الاستخدام الأساسي، أو النقر على إنهاء والانتهاء لتخطيه.

طلب رمز الوصول

نظرًا لأن التطبيقات من آلة إلى آلة تعتبر آمنة (على سبيل المثال، يتم نشرها في شبكة خاصة)، يمكننا استخدام منحة "client_credentials" في OAuth 2.0 للحصول على رمز الوصول. يستخدم المصادقة الأساسية لمصادقة العميل:

  • عنوان URL للطلب هو نقطة النهاية للرموز في مثيل Logto الخاص بك. يمكنك العثور عليه ونسخه في علامة التبويب الإعدادات المتقدمة في صفحة تفاصيل التطبيق من آلة إلى آلة.
  • طريقة الطلب هي POST.
  • عنوان Content-Type للطلب هو application/x-www-form-urlencoded.
  • بالنسبة لعناوين Authorization، القيمة هي Basic <base64(app_id:app_secret)>، حيث app_id و app_secret هما معرف التطبيق والسر للتطبيق من آلة إلى آلة على التوالي. يمكنك العثور عليهما في صفحة تفاصيل التطبيق.
  • يحتاج جسم الطلب إلى تحديد نوع المنحة ومعرف API. على سبيل المثال، grant_type=client_credentials&resource=https://payment.example.com/api.
    • grant_type=client_credentials: قيمة ثابتة لمنحة "client_credentials".
    • resource=https://payment.example.com/api: معرف API لمورد API الذي يريد العميل الوصول إليه.
    • إذا كان يجب أن يتم تفويض التطبيق بأذون (صلاحيات)، يمكنك أيضًا تحديد النطاقات في جسم الطلب. على سبيل المثال، scope=read:payment write:payment. سنتطرق إلى النطاقات لاحقًا.

إليك مثال على الطلب باستخدام curl:

سيكون جسم الاستجابة الناجح كالتالي:

أرسل الطلب مع عنوان التفويض

الآن لدينا رمز الوصول، ويمكننا إضافته إلى عنوان Authorization للطلب إلى مورد API. على سبيل المثال، إذا كنا نريد استدعاء POST /payments API لخدمة الدفع، يمكننا إرسال الطلب التالي:

تحقق من JWT

قد تلاحظ أن خدمة الدفع تحتاج إلى التحقق من JWT باستخدام مجموعة JWK، ويمكن أن يكون لديها ذاكرة مؤقتة محلية لمجموعة JWK لتجنب إحضارها من Logto كل مرة. لحسن الحظ، بسبب شعبية JWT، هناك العديد من المكتبات التي يمكن أن تساعدك على تحقيق الهدف بعدة أسطر من الكود.

عادة ما يطلق على هذه المكتبات "jose" (توقيع وتشفير الكائنات في الجافا سكريبت) أو "jsonwebtoken". على سبيل المثال، في Node.js يمكننا استخدام jose للتحقق من JWT:

إذا نجح التحقق، ستكون المتغير payload هو الحمولة المفكك ل JWT. خلاف ذلك، سيُرمى خطأ.

تطبيق التحكم في الوصول القائم على الأدوار

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

لنفترض أننا نريد السماح لخدمة العربة بإنشاء المدفوعات، ولكن ليس لقراءة المدفوعات.

تعريف الأذون

في Logto، "النطاقات" و "الأذون" قابلة للتبادل. انتقل إلى صفحة تفاصيل مورد API لخدمة الدفع، وانتقل إلى علامة التبويب الأذون. يجب أن تكون فارغة الآن. انقر على إنشاء إذن، أدخل read:payment كاسم للإذن، وأدخل قراءة المدفوعات كوصف للإذن. ثم انقر على إنشاء إذن.

كرر الخطوات السابقة لإنشاء إذن آخر بالاسم write:payment والوصف إنشاء المدفوعات.

إنشاء دور من آلة إلى آلة

الدور هو مجموعة من الأذون. في Logto، يمكن تعيين الأدوار لتطبيقات من آلة إلى آلة لمنح الأذون. انقر على "الأدوار" في الشريط الجانبي الأيسر، وانقر على إنشاء دور.

  1. أدخل checkout كاسم للدور، وأدخل خدمة الخروج كوصف للدور.
  2. انقر على إظهار المزيد من الخيارات. اختر "دور التطبيق من آلة إلى آلة" كنمط للدور.
  3. في قسم "الأذون المعينة"، انقر على أيقونة السهم على اليسار لاسم مورد API (خدمة الدفع)، وحدد إذن write:payment.
    Create role
  4. انقر على إنشاء دور.
  5. نظرًا لأن لدينا بالفعل تطبيق من آلة إلى آلة (خدمة العربة)، يمكننا تعيين الدور مباشرةً له في الخطوة التالية. تحقق من خانة الاختيار على اليسار لاسم التطبيق (خدمة العربة)، وانقر على تعيين التطبيقات.
تعيين الدور للتطبيق

طلب رمز الوصول مع النطاقات

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

لطلب نطاقات متعددة، يمكنك فصلها بالمسافات. على سبيل المثال، scope=write:payment read:payment.

التحقق من النطاقات

إذا كان الإجراء يحتاج إلى إذن write:payment في خدمة الدفع، يمكننا التحقق من النطاقات من خلال التحقق مما إذا كان الادعاء scope لحمولة JWT يحتوي على إذن write:payment:

الخلاصة

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

مع Logto، موارد API الخاصة بك مؤمنة باستخدام OAuth 2.0 و JWT، ويمكنك الالتزام بمبدأ الحد الأدنى من الامتياز من خلال تطبيق التحكم في الوصول القائم على الأدوار. أيضًا، يمكنك استخدام Logto لإدارة المستخدمين وتفويضاتهم، وحتى التكامل مع موفري الهوية من الأطراف الثالثة.