ما هو التدفق الضمني (implicit flow)؟
التدفق الضمني (Implicit flow) في OAuth 2.0 هو طريقة مصادقة تسمح لتطبيقات العميل فقط (مثل SPAs والتطبيقات الأصلية) باستلام الرموز مباشرة من خلال شظايا URL من خادم التفويض دون تقديم سر العميل.
تم تصميم التدفق الضمني (Implicit flow) لتطبيقات العميل فقط، لأنها تعمل بالكامل في المتصفح أو على جهاز المستخدم ولا يمكنها تخزين أسرار العميل بأمان.
تم إلغاء التدفق الضمني (Implicit flow) رسميًا في OAuth 2.1 لأسباب أمنية (سيتم ذكرها أدناه). يجب على تطبيقات العميل فقط الآن استخدام تدفق رمز التفويض (Authorization code flow) مع امتداد مفتاح إثبات تبادل الكود (Proof Key for Code Exchange, PKCE) بدلاً من ذلك.
كيف يعمل التدفق الضمني (implicit flow)؟
الخطوات الرئيسية للتدفق الضمني (Implicit flow) هي كما يلي:
ملاحظة:
-
يحتاج العميل فقط إلى تقديم
client_id
في طلب التفويض، دون الحاجة إلىclient_secret
.
هذا لأن هذه العملاء لا يمكنها تخزين الأسرار بأمان، لذا لا يتطلب هذا التدفق سر العميل. -
يتم تعيين معامل
response_type
إلىtoken
، مما يوجه خادم التفويض لإرجاع رمز الوصول مباشرة بدلاً من رمز التفويض.
في OIDC ( OpenID Connect (OIDC) )، يكونresponse_type
إماid_token
أوid_token token
، وستقوم خدمة المصادقة بإرجاع الرموز المقابلة بناءً على أنواع الاستجابة المختلفة. -
يتم إرجاع الرمز مباشرة في شظية URL. هذا يعني أن الرمز مكشوف في URL ويمكن الوصول إليه بسهولة بواسطة تطبيقات أو نصوص أخرى.
هل التدفق الضمني (implicit flow) آمن؟
لا، يعتبر التدفق الضمني (Implicit flow) في OAuth 2.0 عمومًا أقل أمانًا من التدفقات الأخرى مثل تدفق رمز التفويض (authorization code flow).
لا يُوصى به لمعظم حالات الاستخدام بسبب العديد من الثغرات الأمنية:
-
تعرض الرمز في URL
- تظهر رموز الوصول مباشرة في URL المتصفح (بعد رمز #)
- يمكن أن تكون هذه الرموز:
- محفوظة في تاريخ المتصفح
- مسربة من خلال رؤوس الإحالة
- ملتقطة بواسطة كود JavaScript ضار على نفس الصفحة
-
عدم وجود مصادقة للعميل
- لا يحتاج تطبيق العميل لإثبات هويته
- هذا يعني أن أي شخص يعرف
client_id
يمكنه التظاهر بأنه عميل شرعي
-
عدم وجود رموز تحديث
- لا يدعم هذا التدفق رموز التحديث
- يجب على المستخدمين تسجيل الدخول مرة أخرى عند انتهاء صلاحية رموز الوصول
- لتجنب تسجيل الدخول المتكرر، قد يقوم المستخدمون بتخزين الرموز بطرق غير آمنة
-
عرضة لهجمات XSS
- تتم معالجة جميع الرموز في المتصفح
- إذا تعرض الموقع لهجوم XSS (Cross-Site Scripting)
- يمكن لكود JavaScript الخاص بالمهاجمين سرقة هذه الرموز بسهولة
بسبب هذه المخاوف الأمنية، تم إلغاء التدفق الضمني (Implicit flow) في OAuth 2.1 . يجب على تطبيقات العميل فقط الآن استخدام تدفق رمز التفويض (Authorization code flow) مع امتداد مفتاح إثبات تبادل الكود (Proof Key for Code Exchange, PKCE) بدلاً من ذلك.
يمكنك الاطلاع على ما هو PKCE: من المفاهيم الأساسية إلى الفهم العميق لتتعلم كيف يحمي PKCE تدفق رمز التفويض لتطبيقات العميل فقط.