العربية
  • express-js
  • javascript
  • tutorial
  • auth
  • authentication
  • jwt
  • identity
  • api

حماية واجهة برمجة التطبيقات Express.js باستخدام JWT وLogto

تعلم كيفية حماية نقاط نهاية واجهة برمجة التطبيقات Express.js باستخدام JSON Web Tokens (JWT) وLogto.

Gao
Gao
Founder

المقدمة

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

بافتراض أنك قد قمت بالفعل ببناء تطبيق Express.js مع مصادقة المستخدمين، حيث يجب على المستخدمين تسجيل الدخول قبل اتخاذ إجراءات معينة. إذا لم يكن كذلك، يمكنك بدء رحلتك مع Logto. يتطلب ذلك بضعة أسطر من التعليمات البرمجية لإنشاء تدفق مصادقة المستخدم.

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

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

في هذا الدليل، سنوضح كيفية تعزيز نقاط نهاية واجهة برمجة التطبيقات الخاصة بك باستخدام JSON Web Tokens (JWT) وLogto. هذا النهج يوفر قابلية للتوسع وتكاليف إضافية قليلة.

المتطلبات الأساسية

قبل البدء، تأكد من أن لديك ما يلي:

  • حساب Logto. إذا لم يكن لديك واحد، يمكنك التسجيل مجانًا.
  • مشروع Express.js يحتاج إلى حماية واجهة برمجة التطبيقات وتطبيق عميل يستخدم واجهة برمجة التطبيقات.
  • معرفة أساسية بـ JSON Web Token (JWT).

تحديد مصدر واجهة برمجة التطبيقات في Logto

يستفيد Logto بالكامل من RFC 8707: مؤشرات الموارد لـ OAuth 2.0 لتأمين نقاط نهاية واجهة برمجة التطبيقات الخاصة بك. هذا يعني أنه يمكنك تحديد موارد واجهة البرمجة باستخدام عناوينها URL الفعلية.

انتقل إلى علامة التبويب "موارد واجهة برمجة التطبيقات" في وحدة التحكم Logto وانقر على "إنشاء مصدر واجهة برمجة التطبيقات" لإنشاء مصدر جديد. على سبيل المثال، إذا كنت ترغب في حماية نقطة النهاية /api/products، يمكنك استخدام عنوان URL https://yourdomain.com/api/products كالمعرف.

إنشاء مصدر واجهة برمجة التطبيقات

الحصول على رمز وصول في تطبيق العميل الخاص بك

للمتابعة، ستحتاج إلى دمج Logto SDK في تطبيق العميل الخاص بك. قد يختلف هذا التطبيق عن خلفية Express.js؛ على سبيل المثال، قد يكون لديك تطبيق React يستخدم Express.js كخادم API الخلفي.

ستحتاج أيضًا إلى تعديل تكوين Logto SDK لإبلاغ Logto برغبتك في طلب رمز وصول لموارد واجهة برمجة التطبيقات في هذا الاشتراك. إليك مثال باستخدام React:

بمجرد أن يقوم المستخدم بتسجيل الدخول باستخدام Logto، يصبح isAuthenticated داخل Logto SDK معدلاً إلى true:

يمكنك الآن استخدام طريقة getAccessToken لاسترجاع رمز وصول لواجهة برمجة التطبيقات الخاصة بك:

وأخيرًا، قم بتضمين رمز الوصول هذا في الرأس Authorization عند إجراء طلبات إلى واجهة برمجة التطبيقات الخاصة بك:

التحقق من رمز الوصول في واجهة برمجة التطبيقات الخاصة بك

في تطبيق Express.js الخاص بك، قم بتثبيت مكتبة jose للتحقق من JWT:

نظرًا لاستخدامنا مصادقة Bearer، قم باستخراج رمز الوصول من الرأس Authorization:

بعد ذلك، قم بإنشاء وسيط للتحقق من صحة رمز الوصول:

يمكنك الآن استخدام هذا الوسيط لحماية نقاط نهاية واجهة برمجة التطبيقات الخاصة بك:

مع هذا النهج، لست بحاجة إلى الاتصال بخادم Logto في كل مرة يصل فيها طلب. بدلاً من ذلك، تقوم بجلب مجموعة مفاتيح الويب JSON (JWKS) من خادم Logto مرة واحدة ثم التحقق من الرموز المميزة محليًا.

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

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

لمعالجة ذلك، يمكننا استخدام التحكم في الوصول القائم على الأدوار (RBAC). في Logto، يمكنك تحديد الأدوار وتعيين الأذونات لها. استشر هذا الدليل لتتعلم كيفية تحديد الأدوار والأذونات في Logto.

بعد تحديد الأدوار والأذونات، يمكنك إضافة خيار scopes إلى مكون LogtoProvider:

سوف يقوم Logto بعد ذلك بإصدار رمز وصول بالنطاق المناسب للمستخدم. على سبيل المثال، إذا كان لدى المستخدم نطاق read:products فقط، سيحتوي رمز الوصول فقط على هذا النطاق:

إذا كان لدى المستخدم كلا النطاقين read:products و write:products، سيحتوي رمز الوصول على كلا النطاقين مع وجود مساحة كمقسم:

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

الخاتمة

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

لأي أسئلة، لا تتردد في الانضمام إلى خادم Discord الخاص بنا. مجتمعنا دائمًا سعيد بمساعدتك.