الشامل في ال authentication و ال authorization

هناك كلمتان تتردان في عالم البرمجة كثيرا و هما Authentication و Authorization، فهل سمعت عنهما من قبل؟

الكثير من المبرمجين يخافون (أو يكبرون) هذا الموضوع كثيرا لكنه في الحقيقة بسيط جدا و ممتع. و اليوم سنقوم بتدمير صورة الوحش المخيف التي يراها الكثير :muscle: فهيا بنا…

ماهو الفرق بين Authentication و Authorization؟

مهما كان نوع التطبيق الذي تعمل عليه، هناك بعض الموارد و المعلومات أو الصفحات التي تتطلب أن تعرف من هو ذلك الشخص قبل أن تقدمها له. هذا هو ببساطة مفهوم ال authentication أو المصادقة

لما تتعرف على الشخص (أي أتممت مصادقة العضو) تستطيع أن تعرف هل تسمح له بالوصول لذلك المحتوى أو لا. و هذا ببساطة أيضا مفهوم ال authorization أو التراخيص :grin:

بعد أن انتهينا من الجزء الممل الخاص بالتعريفات، يمكننا الآن أن نغوص في بعض التفاصيل التقنية

و أول سؤال…

ماهي المكونات الأساسية لنظام مصادقة الأعضاء؟

أكيد سيتوجب عليك لبناء نظامك تسجيل أعضاءك في مكان ما (لمشروع عادي سيكون في قاعدة البيانات). يمكنك تسجيل أي بيانات تريدها لكن أقل ما تحتاجه في نظام المصادقة هو اسم المستخدم و كلمة السر.

مثلا في بايثون سيكون بهذا الشكل

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

#...

class User(db.Model):
 
    __tablename__ = 'user'

    username = db.Column(db.String, primary_key=True)
    password = db.Column(db.String)

    def is_active(self):
        """True, as all users are active."""
        return True

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

ما ستفعله بدلا من ذلك هو تشفيرها بطرق تشفير أحادية الاتجاه (يعني يسمح لك بتحويل كلمة السر إلى شكلها المشفر و لكن العكس مستحيل) مثل استعمال خوارزميات SHA و MD5 ( لكن لا تقلق ستجد مكتبات جاهزة لاستعمال هاته الخوارزميات في كل اللغات :ok_hand:)

و هنا قد تطرح السؤال: كيف يمكنني إذا مقارنة كلمة السر عند المصادقة؟

ببساطة سيتطلب ذلك منك تشفير كلمة السر و مقارنتها في كل مرة :ok_hand:

إلى هنا يكون عندك نظام للمستخدم لإرسال اسم المستخدم و كلمة السر و مصادقة المستخدم ثم السماح له بالوصول لمحتوى معين أو العكس عند عدم تطابق اسم المستخدم أو كلمة السر :grin:

و هنا نصل إلى سؤالنا الثاني…

كيف نسجل دخول مستخدم لكي لا يضطر كل مرة لإرسال بياناته؟

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

لحل هذا المشكل يمكننا اما استعمال sessions أو الجلسات و اما استعمال tokens أو التذاكر

ماهو الفرق بين Session و Token؟

سأضع لكم هنا إقتباس لشرح الأستاذ ياسر لتوضيح الفرق :grin:

بعد أن تنتهي من هذا الجزء يسعدني أن أقول لك مبروك أنت الآن تمتلك النظام الهيكلي لمصادقة الأعضاء :tada:

لكن لن نتوقف هنا أكيد بل سنحتاج أن نوفر لأعضاءنا الطريقة المناسبة ل

  • تسجيل حساب
  • تسجيل الخروج
  • تغيير كلمة السر
  • تأكيد البريد الإلكتروني

الخ… و هذا ما يعرف بنظام الحسابات الذي سنبنيه فوق نظام المصادقة الذي بنيناه :ok_hand:

يوجد أيضا بعض الطرق المبتكرة و المستعملة بكثرة في أنظمة المصادقة التي اما سمعت عنها كثيرا (مثل JWT) أو جربتها بنفسك (مثل المصادقة باستعمال Google أو Facebook) و هذا ما سأتحدث عنه في الجزء القادم من الشامل :grin:

في الأخير…

رأينا في المقال المكونات الأساسية لنظام المصادقة و عرفنا المفاهيم الأساسية في كل جزء… و رأيت بنفسك مدى بساطة الأمر و أن الصورة المتوحشة لنظام المصادقة ليست إلا أسطورة👌

و الآن حان وقت الأسئلة… ضع كل استفساراتك هنا في الأسفل :point_down: و سأكون سعيدا بالإجابة عنها كلها

13 Likes

شكرا أخي هشام على الافادة

لم أفهم جيدا :thinking:

في انتظارك :blush:

2 Likes

هاته المصطلحات مستخدمة بكل اللغات تقريبا
في انتظار الحديث عن JWT

3 Likes

موضوع مهم، احسنت الاختيار هشام.

نعم وdjango تقوم بتشفير كلمات السر حينما تستخدم الدوال التي اتاحتها متل

 creat_user() او  create_superuser()

حيث تقوم باخذ كلمة السر وتشفرها وتخزنها في قاعدة البيانات تلقائياً.
وحين تسجيل الدخول يجب ايضا ان تستخدم أيضاً دالة

from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')

ومن خلالها ايضا سيقوم باخذ كلمة السر ومقارنتها مع قاعدة البيانات وفق نظام التشفير المعتمد لدى django.
وفي ما يخص نظام التشفير JWT فهو نظام تشفير للبيانات ويتستخدم في عملية المصادقة حيث يعتمد على رموز اكثر تعقيد ورموز تتغير بشكل دوري بما يعرف ب refresh_token و obtain_token
لكن يجد البعض في استخدامه مشكلة استهلاك مساحة التخزين في حال استخدامه لتشفير البيانات وهذا مقال يوضح رأي الكاتب في هذا الخصوص: https://developer.okta.com/blog/2017/08/17/why-jwts-suck-as-session-tokens

3 Likes

المقصود هو أنه يحول يحول كلمة السر الى شكلها المشفر ولكن ليس هناك طريقة لنجد كلمة السر انطلاقا من شكلها المشفر… فمثلا لو تمت سرقة كلمة السر المشفرة فلا يجد السارق ما يفعل بها :grin:

أتمنى تكون فهمتها بشكل أفضل

3 Likes

شكرا صهيب على اضافاتك…

جانقو رائع صراحة … فكل شيئ جاهز فيه من البداية من بينها نظام المصادقة و الحسابات :heart_eyes:

2 Likes

تمام :ok_hand: شكرا أخي

1 Like

سبب عذابي هو الـ Authentication :woozy_face:

2 Likes

:joy: مع الوقت سيتغير الواقع من مخيف إلى جميل و تصير ال authentication أفضل جزء في تطبيقك :ok_hand:

2 Likes

أتمنى هذا خاصة أنني أريد ربط كل مستخدم مع Map Api خاصته…
هل هذا يندرج ضمن الـ Authorization؟

2 Likes

أكيد كل ما يتعلق بالمستخدمين و صلاحياتهم و ال API Keys يندرج ضمن ال authentication

ماذا تقصد بهذا؟

2 Likes

أريد عمل تطبيق ويب له مبدأ عمل أوبر

1 Like