تأمين موارد API للاتصال من آلة إلى آلة
تعلم كيفية الاستفادة من OAuth 2.0 و JWT لتأمين موارد API للاتصال من آلة إلى آلة.
تعلم كيفية الاستفادة من OAuth 2.0 و JWT لتأمين موارد API للاتصال من آلة إلى آلة.
عند بناء مشروع يتضمن خدمات متعددة، فإن أمان موارد API هو مصدر قلق بالغ الأهمية. في هذه المقالة، سأوضح لك كيفية الاستفادة من OAuth 2.0 و JWT لتأمين الاتصال بين الخدمات (من آلة إلى آلة)، وكيفية تطبيق التحكم في الوصول القائم على الأدوار (RBAC) للالتزام بمبدأ الحد الأدنى من الامتياز.
للمتابعة، أفترض أن لديك المتطلبات السابقة التالية:
لأغراض العرض التوضيحي، لنفترض أن لدينا الخدمات التالية:
https://cart.example.com/apihttps://payment.example.com/apiالآن، تحتاج خدمة العربة إلى الاتصال بخدمة الدفع لمعالجة المدفوعات. تدفق المصادقة كالتالي:
بعض المفاهيم الرئيسية في الرسم البياني أعلاه:
كل مشارك في الرسم البياني أعلاه له دور يلعبه في تدفق المصادقة:
لنمر عبر تدفق المصادقة خطوة بخطوة.
لإجراء تدفق المصادقة، نحتاج إلى إنشاء تطبيق من آلة إلى آلة (خدمة العربة) ومورد API (خدمة الدفع) في Logto.
بالنظر إلى أن خدمة العربة تحتاج إلى أن تكون على علم بمورد API لخدمة الدفع عند إجراء المصادقة، نحتاج إلى إنشاء مورد API أولاً. انتقل إلى Logto Console، انقر على موارد API في الشريط الجانبي الأيسر، وانقر على إنشاء مورد API. في الحوار المفتوح، نقدم بعض الدروس التعليمية لمساعدتك على البدء. يمكنك أيضًا النقر على متابعة بدون درس تعليمي لتخطيه.
أدخل اسم API والمعرف، على سبيل المثال، خدمة الدفع و https://payment.example.com/api، ثم انقر على إنشاء مورد API.
بعد إنشاء مورد API، سيتم تحويلك إلى صفحة التفاصيل. يمكننا تركها كما هي الآن.
انقر على التطبيقات في الشريط الجانبي الأيسر، وانقر على إنشاء تطبيق. في الحوار المفتوح، ابحث عن بطاقة من آلة إلى آلة، ثم انقر على البدء في البناء.
أدخل اسم التطبيق، على سبيل المثال، خدمة العربة، وانقر على إنشاء تطبيق. سيظهر دليل تفاعلي لمساعدتك على إعداد التطبيق. يمكنك اتباع الدليل لفهم الاستخدام الأساسي، أو النقر على إنهاء والانتهاء لتخطيه.
نظرًا لأن التطبيقات من آلة إلى آلة تعتبر آمنة (على سبيل المثال، يتم نشرها في شبكة خاصة)، يمكننا استخدام منحة "client_credentials" في OAuth 2.0 للحصول على رمز الوصول. يستخدم المصادقة الأساسية لمصادقة العميل:
POST.Content-Type للطلب هو application/x-www-form-urlencoded.Authorization، القيمة هي Basic <base64(app_id:app_secret)>، حيث app_id و app_secret هما معرف التطبيق والسر للتطبيق من آلة إلى آلة على التوالي. يمكنك العثور عليهما في صفحة تفاصيل التطبيق.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 باستخدام مجموعة JWK، ويمكن أن يكون لديها ذاكرة مؤقتة محلية لمجموعة JWK لتجنب إحضارها من Logto كل مرة. لحسن الحظ، بسبب شعبية JWT، هناك العديد من المكتبات التي يمكن أن تساعدك على تحقيق الهدف بعدة أسطر من الكود.
عادة ما يطلق على هذه المكتبات "jose" (توقيع وتشفير الكائنات في الجافا سكريبت) أو "jsonwebtoken". على سبيل المثال، في Node.js يمكننا استخدام jose للتحقق من JWT:
إذا نجح التحقق، ستكون المتغير payload هو الحمولة المفكك ل JWT. خلاف ذلك، سيُرمى خطأ.
الآن لقد قمنا بتأمين الاتصال بنجاح بين خدمة العربة وخدمة الدفع. ومع ذلك، فإن تدفق المصادقة يضمن فقط أن العميل هو خدمة العربة الحقيقية، ولكنه لا يضمن أن خدمة العربة لديها أي إذن لأداء الإجراءات على خدمة الدفع.
لنفترض أننا نريد السماح لخدمة العربة بإنشاء المدفوعات، ولكن ليس لقراءة المدفوعات.
في Logto، "النطاقات" و "الأذون" قابلة للتبادل. انتقل إلى صفحة تفاصيل مورد API لخدمة الدفع، وانتقل إلى علامة التبويب الأذون. يجب أن تكون فارغة الآن. انقر على إنشاء إذن، أدخل read:payment كاسم للإذن، وأدخل قراءة المدفوعات كوصف للإذن. ثم انقر على إنشاء إذن.
كرر الخطوات السابقة لإنشاء إذن آخر بالاسم write:payment والوصف إنشاء المدفوعات.
الدور هو مجموعة من الأذون. في Logto، يمكن تعيين الأدوار لتطبيقات من آلة إلى آلة لمنح الأذون. انقر على "الأدوار" في الشريط الجانبي الأيسر، وانقر على إنشاء دور.
checkout كاسم للدور، وأدخل خدمة الخروج كوصف للدور.write:payment.


بالإضافة إلى معلمات جسم الطلب التي ذكرناها في طلب رمز الوصول، يمكننا أيضًا تحديد النطاقات في جسم الطلب. على سبيل المثال، إذا كنا نريد طلب إذن write:payment، يمكننا إرسال الطلب التالي:
لطلب نطاقات متعددة، يمكنك فصلها بالمسافات. على سبيل المثال، scope=write:payment read:payment.
إذا كان الإجراء يحتاج إلى إذن write:payment في خدمة الدفع، يمكننا التحقق من النطاقات من خلال التحقق مما إذا كان الادعاء scope لحمولة JWT يحتوي على إذن write:payment:
إذا كنت ترغب في حماية الوصول إلى خدمة العربة، يمكنك أيضًا تطبيق نفس تدفق المصادقة. هذه المرة، خدمة العربة هي مورد API، والعميل هو خدمة أخرى تحتاج إلى الوصول.
مع Logto، موارد API الخاصة بك مؤمنة باستخدام OAuth 2.0 و JWT، ويمكنك الالتزام بمبدأ الحد الأدنى من الامتياز من خلال تطبيق التحكم في الوصول القائم على الأدوار. أيضًا، يمكنك استخدام Logto لإدارة المستخدمين وتفويضاتهم، وحتى التكامل مع موفري الهوية من الأطراف الثالثة.