آموزش فریمورک فلسک | احراز هویت و مجوزها

سیستم احراز هویت

سیستم احراز هویت (Authentication) یکی از مهم‌ترین بخش‌های هر برنامه وب است. هدف این سیستم این است که مشخص کند «کاربری که به برنامه ما متصل شده، واقعاً همان کسی است که ادعا می‌کند». به زبان ساده، احراز هویت یعنی بررسی هویت کاربر هنگام ورود به برنامه.

برای درک بهتر، یک مثال ساده بزنیم. فرض کنید وارد یک ساختمان اداری می‌شوید. نگهبان از شما کارت شناسایی می‌خواهد تا مطمئن شود شما همان شخصی هستید که اجازه ورود دارید. سیستم احراز هویت در وب هم دقیقاً همین کار را انجام می‌دهد؛ اما به جای کارت شناسایی، از نام کاربری و رمز عبور استفاده می‌کند.

در فلسک، احراز هویت به‌صورت پیش‌فرض و آماده وجود ندارد. این یعنی فلسک خودش یک سیستم ورود و خروج کامل به شما نمی‌دهد، بلکه ابزارها و امکاناتی در اختیار شما قرار می‌دهد تا بتوانید این سیستم را بسازید. این ویژگی باعث می‌شود شما کنترل کامل روی نحوه پیاده‌سازی احراز هویت داشته باشید.

اصلی‌ترین مفهوم در احراز هویت، نشست (Session) است. وقتی کاربر با نام کاربری و رمز عبور صحیح وارد می‌شود، سرور یک «نشست» برای او ایجاد می‌کند. این نشست مانند یک بلیت ورود عمل می‌کند که تا زمانی که کاربر خارج نشده یا مرورگر را نبسته، معتبر است. فلسک برای مدیریت نشست‌ها از یک شیء به نام session استفاده می‌کند که داده‌ها را به‌صورت امن در مرورگر کاربر ذخیره می‌کند.

برای استفاده از session در فلسک، ابتدا باید یک کلید مخفی (Secret Key) برای برنامه تعریف کنید. این کلید برای امضای داده‌های نشست استفاده می‌شود و باعث می‌شود کاربران نتوانند محتوای نشست را دستکاری کنند. تعریف این کلید به این شکل است:

from flask import Flask

app = Flask(__name__)
app.secret_key = 'یک-رشته-تصادفی-و-امن'

پس از تعریف کلید مخفی، می‌توانید در مسیرهای برنامه از session استفاده کنید. برای مثال، در یک مسیر ورود (Login)، پس از بررسی صحت نام کاربری و رمز عبور، نام کاربر را در نشست ذخیره می‌کنید:

from flask import session, redirect, url_for

@app.route('/login', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']

    if username == 'admin' and password == '1234':
        session['user'] = username
        return redirect(url_for('dashboard'))
    else:
        return 'نام کاربری یا رمز عبور اشتباه است'

در کد بالا، وقتی کاربر با اطلاعات صحیح وارد شود، نام او در session با کلید user ذخیره می‌شود. از این لحظه به بعد، در هر بخش از برنامه می‌توانید بررسی کنید که آیا کاربر وارد شده است یا خیر:

@app.route('/dashboard')
def dashboard():
    if 'user' in session:
        return f'خوش آمدید {session["user"]}'
    else:
        return redirect(url_for('login_page'))

برای خروج کاربر هم کافی است اطلاعات نشست او را پاک کنید:

@app.route('/logout')
def logout():
    session.pop('user', None)
    return redirect(url_for('login_page'))

نکته مهم دیگر این است که به‌جای نوشتن این کدها به‌صورت دستی، می‌توانید از افزونه‌ای به نام Flask-Login استفاده کنید. این افزونه بسیاری از کارهای تکراری مثل مدیریت نشست، محافظت از مسیرها و به‌خاطر سپردن کاربر را برای شما انجام می‌دهد. اما برای شروع و درک عمیق مفاهیم، بهتر است ابتدا با روش دستی و استفاده از session آشنا شوید، زیرا پایه و اساس همه سیستم‌های احراز هویت همین مفاهیم است.

یکی از نکات امنیتی مهم این است که هیچ‌وقت رمز عبور کاربران را به‌صورت متن ساده در پایگاه داده ذخیره نکنید. همیشه قبل از ذخیره، رمز عبور را با الگوریتم‌های هش مثل werkzeug.security.generate_password_hash هش کنید و هنگام ورود، با check_password_hash صحت آن را بررسی کنید. این کار باعث می‌شود حتی اگر پایگاه داده لو برود، رمزهای عبور کاربران در امان بمانند.

در نهایت، به یاد داشته باشید که احراز هویت فقط اولین قدم است. پس از اینکه مطمئن شدید کاربر چه کسی است، در مرحله بعد باید مشخص کنید که او اجازه انجام چه کارهایی را دارد. این مرحله همان مفهوم مجوزدهی (Authorization) است که در بخش بعدی به آن خواهیم پرداخت.

پرسش و پاسخ این درس

برای ثبت پرسش ابتدا در سایت وارد شوید.

  • 1
  • 2
  • 3