ساخت سیستم بازیابی رمز عبور با پایتون و Flask

ساخت سیستم بازیابی رمز عبور با پایتون و Flask

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

پیش‌نیازها

قبل از شروع، اطمینان حاصل کنید که موارد زیر را در اختیار دارید:

  • پایتون (نسخه 3.6 یا بالاتر)
  • Flask
  • یک پایگاه داده (مانند SQLite، PostgreSQL یا MySQL)
  • Flask-SQLAlchemy (برای تعامل با پایگاه داده)
  • Flask-Mail (برای ارسال ایمیل)
  • یک حساب کاربری ایمیل (برای ارسال ایمیل‌های بازیابی رمز عبور)

می‌توانید کتابخانه‌های مورد نیاز را با استفاده از pip نصب کنید:

pip install Flask Flask-SQLAlchemy Flask-Mail

طراحی پایگاه داده

برای ذخیره اطلاعات کاربران و توکن‌های بازیابی رمز عبور، به یک پایگاه داده نیاز داریم. یک جدول ساده برای کاربران و یک جدول دیگر برای توکن‌ها می‌تواند کافی باشد.

جدول کاربران (users):

  • id (integer, primary key, auto-increment)
  • username (string, unique)
  • password (string)
  • email (string, unique)

جدول توکن‌ها (password_reset_tokens):

  • id (integer, primary key, auto-increment)
  • user_id (integer, foreign key referencing users.id)
  • token (string, unique)
  • created_at (datetime)

پیاده‌سازی Backend با Flask

اکنون به پیاده‌سازی منطق بازیابی رمز عبور با استفاده از Flask می‌پردازیم.

1. تنظیمات اولیه

ابتدا یک برنامه Flask ایجاد کنید و تنظیمات پایگاه داده و ایمیل را پیکربندی کنید.

from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail, Message
import secrets
import datetime

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key'  # کلید امنیتی را تغییر دهید
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db' # مسیر پایگاه داده را تنظیم کنید
app.config['MAIL_SERVER'] = 'smtp.gmail.com' # سرور SMTP را تنظیم کنید
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = 'your_email@gmail.com' # آدرس ایمیل خود را وارد کنید
app.config['MAIL_PASSWORD'] = 'your_email_password' # رمز عبور ایمیل خود را وارد کنید

db = SQLAlchemy(app)
mail = Mail(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    password = db.Column(db.String(120), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

class PasswordResetToken(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    token = db.Column(db.String(64), unique=True, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.utcnow)

    user = db.relationship('User', backref=db.backref('password_reset_tokens', lazy=True))

with app.app_context():
    db.create_all()

2. ایجاد فرم بازیابی رمز عبور

یک فرم برای دریافت آدرس ایمیل کاربر ایجاد کنید.

@app.route('/reset_password', methods=['GET', 'POST'])
def reset_password_request():
    if request.method == 'POST':
        email = request.form['email']
        user = User.query.filter_by(email=email).first()

        if user:
            token = secrets.token_hex(32)
            password_reset_token = PasswordResetToken(user_id=user.id, token=token)
            db.session.add(password_reset_token)
            db.session.commit()

            msg = Message('بازیابی رمز عبور', recipients=[email])
            msg.body = f'برای بازیابی رمز عبور خود، روی لینک زیر کلیک کنید: {url_for("reset_password_confirm", token=token, _external=True)}'
            mail.send(msg)

            return render_template('reset_password_sent.html')
        else:
            return render_template('reset_password.html', error='آدرس ایمیل یافت نشد.')

    return render_template('reset_password.html')

3. تایید توکن و تنظیم رمز عبور جدید

یک مسیر برای تایید توکن و تنظیم رمز عبور جدید ایجاد کنید.

@app.route('/reset_password_confirm', methods=['GET', 'POST'])
def reset_password_confirm():
    token = request.args.get('token')
    password_reset_token = PasswordResetToken.query.filter_by(token=token).first()

    if not password_reset_token:
        return render_template('reset_password_invalid.html')

    if password_reset_token.created_at + datetime.timedelta(hours=24) < datetime.datetime.utcnow():
        return render_template('reset_password_expired.html')

    if request.method == 'POST':
        new_password = request.form['password']
        user = password_reset_token.user
        user.password = new_password
        db.session.commit()
        return render_template('reset_password_success.html')

    return render_template('reset_password_form.html', token=token)

پیاده‌سازی Frontend (Templates)

برای رابط کاربری، به چند قالب HTML نیاز داریم:

  • reset_password.html: فرم درخواست بازیابی رمز عبور
  • reset_password_sent.html: پیام تایید ارسال ایمیل
  • reset_password_invalid.html: پیام توکن نامعتبر
  • reset_password_expired.html: پیام توکن منقضی شده
  • reset_password_form.html: فرم تنظیم رمز عبور جدید
  • reset_password_success.html: پیام موفقیت‌آمیز تنظیم رمز عبور

نمونه‌ای از قالب reset_password.html:

<!DOCTYPE html>
<html>
<head>
    <title>بازیابی رمز عبور</title>
</head>
<body>
    <h2>بازیابی رمز عبور</h2>
    <form method="post">
        <label for="email">آدرس ایمیل:</label>
        <input type="email" id="email" name="email" required>
        <button type="submit">ارسال درخواست</button>
        {% if error %}
            <p style="color: red;">{{ error }}</p>
        {% endif %}
    </form>
</body>
</html>

سایر قالب‌ها را نیز به طور مشابه طراحی کنید.

نکات امنیتی

در هنگام پیاده‌سازی سیستم بازیابی رمز عبور، رعایت نکات امنیتی بسیار مهم است:

  • استفاده از توکن‌های یکبار مصرف: توکن‌ها باید منحصر به فرد و غیرقابل پیش‌بینی باشند.
  • انقضای توکن‌ها: توکن‌ها باید پس از مدت زمان مشخصی منقضی شوند.
  • استفاده از HTTPS: برای محافظت از اطلاعات حساس در هنگام انتقال، از HTTPS استفاده کنید.
  • اعتبارسنجی ورودی‌ها: ورودی‌های کاربر را به دقت اعتبارسنجی کنید تا از حملات تزریق کد جلوگیری شود.
  • محدود کردن تعداد درخواست‌ها: برای جلوگیری از حملات brute-force، تعداد درخواست‌های بازیابی رمز عبور را محدود کنید.

نتیجه‌گیری

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

بدون دیدگاه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *