بکندباز

آموزش ساخت API ثبت‌نام و ورود کاربران با Python و Flask

امروزه در بسیاری از اپلیکیشن‌ها و سرویس‌های آنلاین، API نقش مهمی در برقراری ارتباط میان بخش‌های مختلف نرم‌افزار و مدیریت داده‌ها دارد. یکی از مهم‌ترین قابلیت‌هایی که تقریباً در تمامی پروژه‌های نرم‌افزاری مورد نیاز است، امکان ثبت‌نام و ورود کاربران است.

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

در این مقاله قصد داریم به شما نحوه‌ی ساخت API ثبت‌نام و ورود کاربران را با استفاده از Python و Flask به صورت قدم‌به‌قدم آموزش دهیم. این آموزش به شما کمک می‌کند تا مفاهیمی مانند احراز هویت کاربران، استفاده از JWT، و ایمن‌سازی داده‌های حساس را بهتر درک کنید.

در پایان این آموزش، شما یک API خواهید داشت که شامل قابلیت‌های زیر است:

  • ثبت‌نام کاربران جدید.
  • ورود کاربران و دریافت توکن JWT برای احراز هویت.
  • ایمن‌سازی اطلاعات کاربران با استفاده از هش کردن رمز عبور.

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

پیش‌نیازها و ابزارهای مورد نیاز

برای شروع پیاده‌سازی API ثبت‌نام و ورود کاربران با استفاده از Flask، ابتدا باید پیش‌نیازها و ابزارهای مورد نیاز را آماده کنیم. این بخش شامل معرفی ابزارها، نصب وابستگی‌ها، و تنظیمات اولیه است.

ابزارها و کتابخانه‌های مورد نیاز

برای اجرای این پروژه، به ابزارها و کتابخانه‌های زیر نیاز داریم:

  1. Python: زبان برنامه‌نویسی اصلی پروژه. پیشنهاد می‌شود از نسخه 3.8 یا بالاتر استفاده کنید.
  2. Flask: فریم‌ورک سبک و قدرتمند برای توسعه وب و API.
  3. Flask-SQLAlchemy: برای مدیریت پایگاه داده به روش ORM.
  4. Flask-Bcrypt: برای هش کردن رمز عبور کاربران.
  5. Flask-JWT-Extended: برای مدیریت توکن‌های JWT و احراز هویت کاربران.

نصب کتابخانه‌ها

ابتدا باید Python و pip (مدیر بسته‌ی Python) را روی سیستم خود نصب کنید. سپس با استفاده از دستور زیر، تمامی کتابخانه‌های مورد نیاز را نصب کنید:

pip install flask flask-sqlalchemy flask-bcrypt flask-jwt-extended
Bash

این دستور تمام وابستگی‌های ضروری را روی سیستم شما نصب خواهد کرد.

تنظیم محیط کاری

برای شروع، یک پوشه جدید برای پروژه ایجاد کرده و فایل‌ها را به صورت زیر سازماندهی کنید:

project/
├── app.py # فایل اصلی برای اجرای برنامه
├── models.py # تعریف مدل‌های پایگاه داده
├── routes/
│ ├── auth.py # مسیرهای مربوط به ثبت‌نام و ورود کاربران
├── database/
│ ├── db_config.py # تنظیمات پایگاه داده
├── utils/
│ ├── validators.py # توابع کمکی برای اعتبارسنجی

بررسی نصب موفق کتابخانه‌ها

پس از نصب کتابخانه‌ها، می‌توانید با اجرای دستورات زیر از نصب صحیح اطمینان حاصل کنید:

python
>>> import flask
>>> import flask_sqlalchemy
>>> import flask_bcrypt
>>> import flask_jwt_extended
Markup

اگر هیچ خطایی دریافت نکردید، محیط کاری شما آماده است.

تنظیم فایل اصلی (app.py)

یک فایل به نام app.py ایجاد کنید و تنظیمات اولیه Flask را در آن وارد کنید:

from flask import Flask

app = Flask(__name__)

# تنظیمات JWT
app.config['JWT_SECRET_KEY'] = 'your_secret_key'

if __name__ == '__main__':
app.run(debug=True)
Python
  • JWT_SECRET_KEY: یک کلید امنیتی برای امضای توکن‌های JWT. این مقدار باید در پروژه واقعی امن نگه داشته شود.
آموزش مرتبط:  تبدیل اسکریپت های پایتون به API بدون نیاز به سرور

آماده‌سازی پایگاه داده

در این پروژه از SQLite به عنوان پایگاه داده استفاده می‌کنیم. برای این منظور، فایل db_config.py را ایجاد کرده و تنظیمات پایگاه داده را در آن وارد کنید:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

def init_db(app):
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///users.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db.init_app(app)
Python

سپس در فایل app.py پایگاه داده را مقداردهی کنید:

from database.db_config import init_db

# تنظیم پایگاه داده
init_db(app)
Python

با انجام این مراحل، محیط کاری شما برای ادامه آماده است. در بخش بعدی، به طراحی مدل کاربر می‌پردازیم.

استفاده از ابزار تبدیل کد به API بکندباز

اگر نمی‌خواهید درگیر نصب ابزارها، تنظیم محیط کاری، یا کار با سرور شوید، می‌توانید به راحتی از ابزار تبدیل کد به API بکندباز استفاده کنید. این ابزار به شما امکان می‌دهد تا کدهای خود را بدون نیاز به دانش فنی پیشرفته و در کمترین زمان به یک API حرفه‌ای تبدیل کنید.

در انتهای مقاله، نحوه استفاده از این ابزار را به طور کامل توضیح خواهیم داد تا بتوانید به سرعت و بدون دردسر API ثبت‌نام و ورود کاربران خود را راه‌اندازی کنید.

طراحی مدل‌ها

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

تعریف مدل کاربر

مدل کاربر شامل اطلاعاتی است که برای ثبت‌نام و ورود کاربران نیاز داریم. این اطلاعات شامل موارد زیر است:

  • id: شناسه‌ی یکتا برای هر کاربر.
  • username: نام کاربری.
  • email: ایمیل کاربر.
  • hashed_password: رمز عبور هش شده برای امنیت بیشتر.

ابتدا فایل models.py را ایجاد کرده و کد زیر را در آن قرار دهید:

from database.db_config import db
from flask_bcrypt import generate_password_hash, check_password_hash

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

id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(50), nullable=False, unique=True)
email = db.Column(db.String(100), nullable=False, unique=True)
hashed_password = db.Column(db.String(200), nullable=False)

# متد برای هش کردن رمز عبور
def set_password(self, password):
self.hashed_password = generate_password_hash(password).decode('utf-8')

# متد برای بررسی صحت رمز عبور
def check_password(self, password):
return check_password_hash(self.hashed_password, password)
Python

توضیح کد:

  1. id:
    • نوع: عدد صحیح.
    • ویژگی: کلید اصلی (Primary Key).
  2. username:
    • نوع: رشته (حداکثر 50 کاراکتر).
    • ویژگی: باید یکتا باشد (Unique).
  3. email:
    • نوع: رشته (حداکثر 100 کاراکتر).
    • ویژگی: باید یکتا باشد.
  4. hashed_password:
    • نوع: رشته (برای ذخیره رمز عبور هش شده).

توابع کمکی:

  • set_password: رمز عبور را با استفاده از Flask-Bcrypt هش می‌کند و مقدار هش شده را ذخیره می‌کند.
  • check_password: رمز عبور وارد شده را با مقدار هش شده مقایسه می‌کند و در صورت مطابقت، مقدار True باز می‌گرداند.

مقداردهی اولیه پایگاه داده

برای ایجاد جدول کاربران در پایگاه داده، باید از کد زیر در فایل app.py استفاده کنید:

from models import User
from database.db_config import db

@app.before_first_request
def create_tables():
db.create_all()
Python

این کد تضمین می‌کند که جداول پایگاه داده در اولین اجرای برنامه ایجاد شوند.

تست مدل کاربر

برای اطمینان از عملکرد مدل، می‌توانید یک کاربر آزمایشی را به پایگاه داده اضافه کنید:

@app.route('/create-test-user', methods=['GET'])
def create_test_user():
user = User(username='testuser', email='test@example.com')
user.set_password('password123')
db.session.add(user)
db.session.commit()
return {'message': 'Test user created successfully!'}
Python

با اجرای این مسیر (/create-test-user)، یک کاربر نمونه در پایگاه داده ایجاد می‌شود.

آموزش مرتبط:  چطور با پایتون بازی بسازیم؟

در این مرحله، مدل کاربر طراحی و آماده استفاده است. در بخش بعدی، به پیاده‌سازی مسیرهای API برای ثبت‌نام و ورود کاربران می‌پردازیم.

پیاده‌سازی API

در این بخش، دو endpoint اصلی برای ثبت‌نام و ورود کاربران پیاده‌سازی می‌کنیم. این endpointها به ترتیب وظیفه دریافت اطلاعات کاربران جدید و احراز هویت کاربران موجود را بر عهده دارند.

ساخت endpoint ثبت‌نام

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

در فایل auth.py (داخل پوشه routes) کد زیر را اضافه کنید:

from flask import Blueprint, request, jsonify
from models import User
from database.db_config import db

auth_bp = Blueprint('auth', __name__)

@auth_bp.route('/register', methods=['POST'])
def register():
data = request.get_json()

# اعتبارسنجی داده‌ها
username = data.get('username')
email = data.get('email')
password = data.get('password')

if not username or not email or not password:
return jsonify({'error': 'تمام فیلدها باید پر شوند'}), 400

# بررسی وجود کاربر با نام کاربری یا ایمیل تکراری
if User.query.filter_by(username=username).first():
return jsonify({'error': 'این نام کاربری قبلاً ثبت شده است'}), 400
if User.query.filter_by(email=email).first():
return jsonify({'error': 'این ایمیل قبلاً ثبت شده است'}), 400

# ایجاد کاربر جدید
new_user = User(username=username, email=email)
new_user.set_password(password)
db.session.add(new_user)
db.session.commit()

return jsonify({'message': 'ثبت‌نام با موفقیت انجام شد!'}), 201
Python

توضیح کد:

  1. دریافت داده‌ها از کاربر:
    • اطلاعات username، email و password از درخواست JSON گرفته می‌شوند.
  2. اعتبارسنجی داده‌ها:
    • بررسی می‌شود که هیچ‌کدام از فیلدها خالی نباشند.
  3. بررسی یکتا بودن اطلاعات:
    • اطمینان حاصل می‌شود که نام کاربری و ایمیل قبلاً ثبت نشده باشند.
  4. ذخیره کاربر جدید در پایگاه داده:
    • رمز عبور هش شده و اطلاعات کاربر ذخیره می‌شود.

ساخت endpoint ورود

این مسیر اطلاعات کاربر (ایمیل و رمز عبور) را دریافت کرده و پس از احراز هویت، یک توکن JWT تولید می‌کند.

در ادامه به فایل auth.py کد زیر را اضافه کنید:

from flask_jwt_extended import create_access_token

@auth_bp.route('/login', methods=['POST'])
def login():
data = request.get_json()

# دریافت اطلاعات ورود
email = data.get('email')
password = data.get('password')

if not email or not password:
return jsonify({'error': 'ایمیل و رمز عبور الزامی است'}), 400

# یافتن کاربر در پایگاه داده
user = User.query.filter_by(email=email).first()
if not user or not user.check_password(password):
return jsonify({'error': 'ایمیل یا رمز عبور اشتباه است'}), 401

# تولید توکن JWT
access_token = create_access_token(identity={'id': user.id, 'username': user.username})
return jsonify({'token': access_token}), 200
Python

توضیح کد:

  1. دریافت داده‌ها از درخواست:
    • اطلاعات email و password از درخواست JSON گرفته می‌شوند.
  2. احراز هویت کاربر:
    • کاربر بر اساس ایمیل جستجو شده و رمز عبور وارد شده بررسی می‌شود.
  3. تولید توکن JWT:
    • یک توکن دسترسی با استفاده از اطلاعات کاربر تولید و به کلاینت بازگردانده می‌شود.

افزودن مسیرها به برنامه اصلی

برای استفاده از مسیرهای بالا، فایل app.py را به‌روزرسانی کنید:

from routes.auth import auth_bp

# ثبت Blueprint مربوط به احراز هویت
app.register_blueprint(auth_bp, url_prefix='/auth')
Python

 

تست API

برای تست مسیرهای ثبت‌نام و ورود:

  1. از ابزار Postman یا curl استفاده کنید.
  2. یک درخواست POST به /auth/register ارسال کرده و اطلاعات کاربر را وارد کنید.
  3. یک درخواست POST به /auth/login ارسال کرده و ایمیل و رمز عبور کاربر را امتحان کنید.
آموزش مرتبط:  ساخت بازی شطرنج با پایتون

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

تست و بهبود امنیت API

اکنون که API ثبت‌نام و ورود کاربران را پیاده‌سازی کردیم، باید از عملکرد صحیح آن اطمینان حاصل کنیم و برخی نکات امنیتی را برای بهبود ایمنی داده‌ها اضافه کنیم. در این بخش، به موارد زیر می‌پردازیم:

  • تست API با ابزار Postman.
  • نوشتن تست‌های خودکار.
  • نکات امنیتی برای ایمن‌سازی API.

تست API با ابزار Postman

  1. تست مسیر ثبت‌نام:
    • در Postman، یک درخواست POST به آدرس /auth/register ایجاد کنید.
    • در تب Body، داده‌های زیر را به فرمت JSON وارد کنید:
      {
      "username": "testuser",
      "email": "test@example.com",
      "password": "password123"
      }
      JSON
    • روی Send کلیک کنید. اگر داده‌ها درست باشند، باید پاسخ زیر را دریافت کنید:
      {
      "message": "ثبت‌نام با موفقیت انجام شد!"
      }
      JSON
  2. تست مسیر ورود:
    • یک درخواست POST به آدرس /auth/login ارسال کنید.
    • در تب Body، داده‌های ورود کاربر را به فرمت JSON وارد کنید:
      {
      "email": "test@example.com",
      "password": "password123"
      }
      JSON
    • در صورت موفقیت، پاسخ زیر باز خواهد گشت:
      {
      "token": "your_jwt_token_here"
      }
      JSON

نوشتن تست‌های خودکار

تست خودکار API با استفاده از unittest می‌تواند به شناسایی باگ‌ها و تضمین عملکرد صحیح کمک کند. برای مثال:

import unittest
from app import app

class AuthTestCase(unittest.TestCase):
def setUp(self):
self.app = app.test_client()
self.app.testing = True

def test_register_user(self):
response = self.app.post('/auth/register', json={
'username': 'testuser',
'email': 'test@example.com',
'password': 'password123'
})
self.assertEqual(response.status_code, 201)

def test_login_user(self):
self.app.post('/auth/register', json={
'username': 'testuser',
'email': 'test@example.com',
'password': 'password123'
})
response = self.app.post('/auth/login', json={
'email': 'test@example.com',
'password': 'password123'
})
self.assertEqual(response.status_code, 200)
Python

برای اجرای تست‌ها:

python -m unittest discover
Bash

نکات امنیتی برای بهبود API

  1. استفاده از HTTPS:
    • مطمئن شوید که API شما در محیط واقعی از پروتکل HTTPS استفاده می‌کند تا داده‌ها رمزنگاری شوند.
  2. Rate Limiting:
    • برای جلوگیری از حملات brute force، تعداد درخواست‌های ورود را محدود کنید. با استفاده از کتابخانه Flask-Limiter می‌توانید این کار را انجام دهید:
      pip install flask-limiter
      
      Python

      سپس در فایل app.py:

      from flask_limiter import Limiter
      from flask_limiter.util import get_remote_address
      
      limiter = Limiter(get_remote_address, app=app)
      
      @auth_bp.route('/login', methods=['POST'])
      @limiter.limit("5 per minute")
      def login():
          # کد مسیر ورود
      
      Python
  3. اعتبارسنجی داده‌های ورودی:
    • اطمینان حاصل کنید که ایمیل‌ها و رمز عبورهای وارد شده از الگوهای استاندارد پیروی می‌کنند. می‌توانید از توابع کمکی در فایل validators.py استفاده کنید:
      import re
      
      def validate_email(email):
          return re.match(r'^\S+@\S+\.\S+$', email) is not None
      
      def validate_password(password):
          return len(password) >= 8
      Python
  4. ذخیره ایمن توکن‌ها:
    • توکن‌های JWT را در سمت کلاینت با امنیت کامل ذخیره کنید (ترجیحاً در HttpOnly Cookies).

استفاده از ابزار تبدیل کد به API بکندباز

اگر نمی‌خواهید درگیر مراحل نصب، تنظیمات محیط، و کدنویسی شوید، می‌توانید از ابزار تبدیل کد به API بکندباز استفاده کنید. این ابزار به شما این امکان را می‌دهد که کدهای Python خود را مستقیماً به یک API قابل استفاده تبدیل کنید. کافی است:

  1. وارد وب‌سایت بکندباز شوید.
  2. کد خود را در ابزار تبدیل کپی کنید.
  3. API ساخته‌شده را دریافت کنید و در پروژه خود استفاده کنید.

این ابزار مخصوصاً برای توسعه‌دهندگانی که می‌خواهند در زمان صرفه‌جویی کنند بسیار کاربردی است.

 

backendbaz

مدیر وب سایت بکندباز

دیدگاه‌ها

*
*