JSON Web Tokens سهلة الاستخدام وتصحيح الأخطاء ، لكنها تقدم أيضًا تعزيزًا أمانًا رائعًا.

لا تزال المصادقة المعطلة تمثل ثغرة أمنية دائمة في تطبيقات الويب الحديثة - فهي لا تزال تحتل مرتبة عالية في أعلى 10 مخاطر أمنية لواجهة برمجة تطبيقات OWASP.

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

اكتشف كيف يمكنك تنفيذ مصادقة المستخدم في Flask باستخدام JSON Web Tokens (JWT) ، وهي طريقة شائعة وفعالة تعتمد على الرموز المميزة.

المصادقة المستندة إلى رمز باستخدام رموز الويب JSON

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

تقدم JWTs ، على وجه الخصوص ، نهجًا آمنًا ومدمجًا لنقل بيانات اعتماد المستخدمين المطلوبة بين التطبيقات والخوادم من جانب العميل.

يتكون JWT من ثلاثة مكونات رئيسية: الرأس والحمولة والتوقيع. يحتوي الرأس على بيانات وصفية حول الرمز المميز ، بما في ذلك خوارزمية التجزئة المستخدمة لتشفير الرمز المميز.

instagram viewer

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

باستخدام JWTs ، يمكنك مصادقة المستخدمين وتخزين بيانات الجلسة كلها داخل الرمز المميز نفسه.

قم بإعداد مشروع Flask وقاعدة بيانات MongoDB

للبدء ، أنشئ دليل مشروع جديدًا باستخدام Terminal:

مشروع قارورة مكدير
مشروع قارورة سي دي

بعد ذلك ، قم بتثبيت فيرتالينف، لإنشاء بيئة تطوير افتراضية محلية لمشروع Flask الخاص بك.

Virtualenv venv

أخيرًا ، قم بتنشيط البيئة الافتراضية.

# يونكس أو ماك: 
مصدر venv / بن / تفعيل

# شبابيك:
. \ venv \ Scripts \ تفعيل

يمكنك العثور على رمز هذا المشروع في هذا مستودع جيثب.

قم بتثبيت الحزم المطلوبة

في الدليل الجذر لمجلد المشروع الخاص بك ، قم بإنشاء ملف المتطلبات. txt ملف وإضافة هذه التبعيات للمشروع:

قارورة
بيجوت
بيثون دوتنف
بيمونغو
bcrypt

أخيرًا ، قم بتشغيل الأمر أدناه لتثبيت الحزم. تأكد من أن لديك نقطة (مدير الحزم) مثبت ؛ ان لم، قم بتثبيته على نظام Windows أو Mac أو Linux.

Pip install- متطلبات rtxt

قم بإنشاء قاعدة بيانات MongoDB

انطلق وأنشئ قاعدة بيانات MongoDB. أنت تستطيع إنشاء قاعدة بيانات MongoDB محلية، بدلاً عن ذلك، إنشاء كتلة في MongoDB Atlas ، وهي خدمة MongoDB قائمة على السحابة.

بمجرد إنشاء قاعدة البيانات ، انسخ عنوان URI للاتصال وأنشئ ملف .env ملف في الدليل الجذر لمشروعك ، وقم بإضافته على النحو التالي:

MONGO_URI = ""

أخيرًا ، قم بتكوين اتصال قاعدة البيانات من تطبيق Flask الخاص بك. إنشاء ملف utils / db.py ملف في الدليل الجذر لمشروعك ، مع هذا الرمز:

من بيمونغو يستورد MongoClient

defconnect_to_mongodb(mongo_uri):
العميل = MongoClient (mongo_uri)
db = client.get_database ("المستخدمون")
يعود ديسيبل

تنشئ هذه الوظيفة اتصالاً بقاعدة بيانات MongoDB باستخدام URI للاتصال المقدم. ثم يقوم بإنشاء ملف المستخدمين المجموعة إذا لم تكن موجودة ، وتقوم بإرجاع طبعة قاعدة البيانات المقابلة.

قم بإنشاء Flask Web Server

مع تكوين قاعدة البيانات ، امض قدمًا وقم بإنشاء ملف app.py ملف في الدليل الجذر لمجلد المشروع ، وأضف التعليمات البرمجية التالية لإنشاء مثيل لتطبيق Flask.

من قارورة يستورد قارورة
من الطرق. user_auth يستورد Register_routes
من الاستخدامات. db يستورد connect_to_mongodb
يستورد نظام التشغيل
من دوتنف يستورد تحميل

التطبيق = قارورة (__name__)
load_dotenv ()

mongo_uri = os.getenv ("MONGO_URI")
db = connect_to_mongodb (mongo_uri)

register_routes (التطبيق ، ديسيبل)

لو __name__ == '__رئيسي__':
app.run (تصحيح =حقيقي)

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

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

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

من pymongo.collection يستورد مجموعة
من bson.objectid يستورد معرف الكائن

فصلمستخدم:
def__فيه__(self، collection: collection، username: str، password: str):
self.collection = جمع
self.username = اسم المستخدم
self.password = كلمة المرور
defيحفظ(الذات):
user_data = {
'اسم المستخدم': self.username،
'كلمة المرور': self.password
}
النتيجة = self.collection.insert_one (بيانات المستخدم)
يعود str (result.inserted_id)

تضمين التغريدة
deffind_by_id(المجموعة: المجموعة ، user_id: str):
يعود collection.find_one ({'_بطاقة تعريف': معرف الكائن (user_id)})

تضمين التغريدة
deffind_by_username(المجموعة: المجموعة ، اسم المستخدم: str):
يعود collection.find_one ({'اسم المستخدم': اسم المستخدم})

يحدد الكود أعلاه أ مستخدم فئة تعمل كنموذج بيانات وتحدد عدة طرق للتفاعل مع مجموعة MongoDB لأداء العمليات المتعلقة بالمستخدم.

  1. ال يحفظ تقوم الطريقة بحفظ مستند مستخدم جديد مع اسم المستخدم وكلمة المرور المقدمين إلى مجموعة MongoDB وإرجاع معرف المستند المُدرج.
  2. ال find_by_id و find_by_username طرق استرداد مستندات المستخدم من المجموعة بناءً على معرف المستخدم المقدم أو اسم المستخدم ، على التوالي.

تحديد مسارات المصادقة

  1. لنبدأ بتحديد مسار التسجيل. سيضيف هذا المسار بيانات مستخدم جديدة إلى مجموعة مستخدمي MongoDB. في الدليل الجذر ، قم بإنشاء ملف المسارات / user_auth.py ملف ، والتعليمات البرمجية التالية.
    يستورد جي دبليو تي
    من functools يستورد يلف
    من قارورة يستورد jsonify، request، make_response
    من النماذج يستورد مستخدم
    يستورد bcrypt
    يستورد نظام التشغيل

    defRegister_routes(التطبيق ، ديسيبل):
    المجموعة = db.users
    app.config ["SECRET_KEY"] = os.urandom (24)

    @ app.route ('/ api / register' ، الأساليب = ['POST'])
    defيسجل():

    اسم المستخدم = request.json.get ('اسم المستخدم')
    كلمة المرور = request.json.get ('كلمة المرور')

    Current_user = User.find_by_username (مجموعة ، اسم مستخدم)
    لو مستخدم موجود:
    يعود jsonify ({'رسالة': 'اسم المستخدم موجود بالفعل!'})

    hashed_password = bcrypt.hashpw (password.encode ("utf-8") و bcrypt.gensalt ())
    new_user = مستخدم (مجموعة ، اسم مستخدم ، hashed_password.decode ("utf-8"))
    user_id = new_user.save ()

    يعود jsonify ({'رسالة': "تم تسجيل المستخدم بنجاح!", 'معرف المستخدم': معرف المستخدم})

  2. تنفيذ وظيفة تسجيل الدخول للتعامل مع عملية المصادقة والتحقق من بيانات اعتماد المستخدم. تحت مسار التسجيل ، أضف الكود التالي.
     @ app.route ('/ api / login'، طرق = ['POST'])
    defتسجيل الدخول():
    اسم المستخدم = request.json.get ('اسم المستخدم')
    كلمة المرور = request.json.get ('كلمة المرور')
    user = User.find_by_username (مجموعة ، اسم مستخدم)
    لو مستخدم:
    لو bcrypt.checkpw (password.encode ("utf-8")، مستخدم['كلمة المرور'] .encode ("utf-8")):
    الرمز المميز = jwt.encode ({'معرف المستخدم': str (مستخدم ['_بطاقة تعريف'])} ، app.config ["SECRET_KEY"] ، الخوارزمية ="HS256")

    response = make_response (jsonify ({'رسالة': "تم تسجيل الدخول بنجاح!"}))
    response.set_cookie ("رمز"، رمز)
    يعود إجابة

    يعود jsonify ({'رسالة': 'خطأ في اسم المستخدم أو كلمة مرور'})

    تقوم نقطة نهاية تسجيل الدخول بأمرين: فهي تتحقق من بيانات اعتماد المستخدم المقدمة ، وعند المصادقة الناجحة ، تقوم بإنشاء JWT فريد لهذا المستخدم. يقوم بتعيين هذا الرمز المميز كملف تعريف ارتباط في الاستجابة ، إلى جانب حمولة JSON التي تشير إلى تسجيل دخول ناجح. إذا كانت بيانات الاعتماد غير صالحة ، فستعرض استجابة JSON للإشارة إلى ذلك.
  3. حدد وظيفة الزخرفة التي تتحقق من JSON Web Tokens (JWTs) التي تم تمريرها مع طلبات API اللاحقة. أضف الكود أدناه داخل ملف Register_routes كتلة رمز الوظيفة.
    defمطلوب token_required(F):
    wraps (f)
    defمزين(* args ، ** kwargs):
    الرمز المميز = request.cookies.get ("رمز")

    لولا رمز مميز:
    يعود jsonify ({'رسالة': "الرمز مفقود!"}), 401

    يحاول:
    data = jwt.decode (رمز مميز ، app.config ["SECRET_KEY"] ، الخوارزميات = ["HS256"])
    current_user = User.find_by_id (جمع ، بيانات ['معرف المستخدم'])
    يستثني جي دبليو تي. منتهي الصلاحية خطأ:
    يعود jsonify ({'رسالة': "انتهت صلاحية الرمز المميز!"}), 401
    يستثني جي دبليو تي. InvalidTokenError:
    يعود jsonify ({'رسالة': "رمز غير صالح!"}), 401

    يعود f (current_user، * args، ** kwargs)

    يعود مزين

    تضمن وظيفة الزخرفة هذه وجود رمز JWT صالح في طلبات API اللاحقة. يتحقق مما إذا كان الرمز المميز مفقودًا أو منتهي الصلاحية أو صالحًا ، ويعيد استجابة JSON المناسبة إذا كان كذلك.
  4. أخيرًا ، قم بإنشاء مسار محمي.
     @ app.route ('/ api / users' ، طرق = ['GET'])
    تضمين التغريدة
    defget_users(المستخدم الحالي):
    users = list (collection.find ({}، {'_بطاقة تعريف': 0}))
    يعود jsonify (المستخدمون)

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

أخيرًا ، قم بتشغيل الأمر أدناه لتدوير خادم التطوير.

تشغيل القارورة

لاختبار التسجيل وتسجيل الدخول ونقطة نهاية المستخدمين المحميين ، يمكنك استخدام Postman أو أي عميل API آخر. إرسال الطلبات إلى http://localhost: 5000/api/ومراقبة الاستجابات للتحقق من وظائف نقاط نهاية API هذه.

هل مصادقة الرمز المميز إجراء أمني مضمون؟

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

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