امروزه در بسیاری از اپلیکیشنها و سرویسهای آنلاین، API نقش مهمی در برقراری ارتباط میان بخشهای مختلف نرمافزار و مدیریت دادهها دارد. یکی از مهمترین قابلیتهایی که تقریباً در تمامی پروژههای نرمافزاری مورد نیاز است، امکان ثبتنام و ورود کاربران است.
فریمورک Flask، به عنوان یکی از سبکترین و در عین حال قدرتمندترین فریمورکهای Python، ابزاری عالی برای توسعه APIها محسوب میشود. این فریمورک به دلیل انعطافپذیری و سادگی خود، گزینهای ایدهآل برای توسعهدهندگان مبتدی و حتی حرفهای است.
در این مقاله قصد داریم به شما نحوهی ساخت API ثبتنام و ورود کاربران را با استفاده از Python و Flask به صورت قدمبهقدم آموزش دهیم. این آموزش به شما کمک میکند تا مفاهیمی مانند احراز هویت کاربران، استفاده از JWT، و ایمنسازی دادههای حساس را بهتر درک کنید.
در پایان این آموزش، شما یک API خواهید داشت که شامل قابلیتهای زیر است:
- ثبتنام کاربران جدید.
- ورود کاربران و دریافت توکن JWT برای احراز هویت.
- ایمنسازی اطلاعات کاربران با استفاده از هش کردن رمز عبور.
در ادامه ابتدا پیشنیازها و ابزارهای مورد نیاز را معرفی خواهیم کرد و سپس به پیادهسازی API خواهیم پرداخت. اگر به دنبال یادگیری کاربردی Python و Flask هستید، این آموزش بهترین نقطهی شروع برای شما خواهد بود.
پیشنیازها و ابزارهای مورد نیاز
برای شروع پیادهسازی API ثبتنام و ورود کاربران با استفاده از Flask، ابتدا باید پیشنیازها و ابزارهای مورد نیاز را آماده کنیم. این بخش شامل معرفی ابزارها، نصب وابستگیها، و تنظیمات اولیه است.
ابزارها و کتابخانههای مورد نیاز
برای اجرای این پروژه، به ابزارها و کتابخانههای زیر نیاز داریم:
- Python: زبان برنامهنویسی اصلی پروژه. پیشنهاد میشود از نسخه 3.8 یا بالاتر استفاده کنید.
- Flask: فریمورک سبک و قدرتمند برای توسعه وب و API.
- Flask-SQLAlchemy: برای مدیریت پایگاه داده به روش ORM.
- Flask-Bcrypt: برای هش کردن رمز عبور کاربران.
- Flask-JWT-Extended: برای مدیریت توکنهای JWT و احراز هویت کاربران.
نصب کتابخانهها
ابتدا باید Python و pip (مدیر بستهی Python) را روی سیستم خود نصب کنید. سپس با استفاده از دستور زیر، تمامی کتابخانههای مورد نیاز را نصب کنید:
pip install flask flask-sqlalchemy flask-bcrypt flask-jwt-extended
این دستور تمام وابستگیهای ضروری را روی سیستم شما نصب خواهد کرد.
تنظیم محیط کاری
برای شروع، یک پوشه جدید برای پروژه ایجاد کرده و فایلها را به صورت زیر سازماندهی کنید:
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
اگر هیچ خطایی دریافت نکردید، محیط کاری شما آماده است.
تنظیم فایل اصلی (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)
- JWT_SECRET_KEY: یک کلید امنیتی برای امضای توکنهای JWT. این مقدار باید در پروژه واقعی امن نگه داشته شود.
آمادهسازی پایگاه داده
در این پروژه از 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)
سپس در فایل app.py
پایگاه داده را مقداردهی کنید:
from database.db_config import init_db
# تنظیم پایگاه داده
init_db(app)
با انجام این مراحل، محیط کاری شما برای ادامه آماده است. در بخش بعدی، به طراحی مدل کاربر میپردازیم.
استفاده از ابزار تبدیل کد به 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)
توضیح کد:
- id:
- نوع: عدد صحیح.
- ویژگی: کلید اصلی (Primary Key).
- username:
- نوع: رشته (حداکثر 50 کاراکتر).
- ویژگی: باید یکتا باشد (Unique).
- email:
- نوع: رشته (حداکثر 100 کاراکتر).
- ویژگی: باید یکتا باشد.
- 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()
این کد تضمین میکند که جداول پایگاه داده در اولین اجرای برنامه ایجاد شوند.
تست مدل کاربر
برای اطمینان از عملکرد مدل، میتوانید یک کاربر آزمایشی را به پایگاه داده اضافه کنید:
@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!'}
با اجرای این مسیر (/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
توضیح کد:
- دریافت دادهها از کاربر:
- اطلاعات
username
،email
وpassword
از درخواست JSON گرفته میشوند.
- اطلاعات
- اعتبارسنجی دادهها:
- بررسی میشود که هیچکدام از فیلدها خالی نباشند.
- بررسی یکتا بودن اطلاعات:
- اطمینان حاصل میشود که نام کاربری و ایمیل قبلاً ثبت نشده باشند.
- ذخیره کاربر جدید در پایگاه داده:
- رمز عبور هش شده و اطلاعات کاربر ذخیره میشود.
ساخت 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
توضیح کد:
- دریافت دادهها از درخواست:
- اطلاعات
email
وpassword
از درخواست JSON گرفته میشوند.
- اطلاعات
- احراز هویت کاربر:
- کاربر بر اساس ایمیل جستجو شده و رمز عبور وارد شده بررسی میشود.
- تولید توکن JWT:
- یک توکن دسترسی با استفاده از اطلاعات کاربر تولید و به کلاینت بازگردانده میشود.
افزودن مسیرها به برنامه اصلی
برای استفاده از مسیرهای بالا، فایل app.py
را بهروزرسانی کنید:
from routes.auth import auth_bp
# ثبت Blueprint مربوط به احراز هویت
app.register_blueprint(auth_bp, url_prefix='/auth')
تست API
برای تست مسیرهای ثبتنام و ورود:
- از ابزار Postman یا curl استفاده کنید.
- یک درخواست
POST
به/auth/register
ارسال کرده و اطلاعات کاربر را وارد کنید. - یک درخواست
POST
به/auth/login
ارسال کرده و ایمیل و رمز عبور کاربر را امتحان کنید.
با انجام این مراحل، API شما قابلیت ثبتنام و ورود کاربران را فراهم میکند. در بخش بعدی، به نحوه تست، بهبود امنیت و توضیحات مربوط به ابزار تبدیل کد به API بکندباز خواهیم پرداخت.
تست و بهبود امنیت API
اکنون که API ثبتنام و ورود کاربران را پیادهسازی کردیم، باید از عملکرد صحیح آن اطمینان حاصل کنیم و برخی نکات امنیتی را برای بهبود ایمنی دادهها اضافه کنیم. در این بخش، به موارد زیر میپردازیم:
- تست API با ابزار Postman.
- نوشتن تستهای خودکار.
- نکات امنیتی برای ایمنسازی API.
تست API با ابزار Postman
- تست مسیر ثبتنام:
- در Postman، یک درخواست
POST
به آدرس/auth/register
ایجاد کنید. - در تب Body، دادههای زیر را به فرمت JSON وارد کنید:
{ "username": "testuser", "email": "test@example.com", "password": "password123" }
- روی Send کلیک کنید. اگر دادهها درست باشند، باید پاسخ زیر را دریافت کنید:
{ "message": "ثبتنام با موفقیت انجام شد!" }
- در Postman، یک درخواست
- تست مسیر ورود:
- یک درخواست
POST
به آدرس/auth/login
ارسال کنید. - در تب Body، دادههای ورود کاربر را به فرمت JSON وارد کنید:
{ "email": "test@example.com", "password": "password123" }
- در صورت موفقیت، پاسخ زیر باز خواهد گشت:
{ "token": "your_jwt_token_here" }
- یک درخواست
نوشتن تستهای خودکار
تست خودکار 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 -m unittest discover
نکات امنیتی برای بهبود API
- استفاده از HTTPS:
- مطمئن شوید که API شما در محیط واقعی از پروتکل HTTPS استفاده میکند تا دادهها رمزنگاری شوند.
- Rate Limiting:
- برای جلوگیری از حملات brute force، تعداد درخواستهای ورود را محدود کنید. با استفاده از کتابخانه
Flask-Limiter
میتوانید این کار را انجام دهید:pip install flask-limiter
سپس در فایل
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(): # کد مسیر ورود
- برای جلوگیری از حملات brute force، تعداد درخواستهای ورود را محدود کنید. با استفاده از کتابخانه
- اعتبارسنجی دادههای ورودی:
- اطمینان حاصل کنید که ایمیلها و رمز عبورهای وارد شده از الگوهای استاندارد پیروی میکنند. میتوانید از توابع کمکی در فایل
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
- اطمینان حاصل کنید که ایمیلها و رمز عبورهای وارد شده از الگوهای استاندارد پیروی میکنند. میتوانید از توابع کمکی در فایل
- ذخیره ایمن توکنها:
- توکنهای JWT را در سمت کلاینت با امنیت کامل ذخیره کنید (ترجیحاً در
HttpOnly Cookies
).
- توکنهای JWT را در سمت کلاینت با امنیت کامل ذخیره کنید (ترجیحاً در
استفاده از ابزار تبدیل کد به API بکندباز
اگر نمیخواهید درگیر مراحل نصب، تنظیمات محیط، و کدنویسی شوید، میتوانید از ابزار تبدیل کد به API بکندباز استفاده کنید. این ابزار به شما این امکان را میدهد که کدهای Python خود را مستقیماً به یک API قابل استفاده تبدیل کنید. کافی است:
- وارد وبسایت بکندباز شوید.
- کد خود را در ابزار تبدیل کپی کنید.
- API ساختهشده را دریافت کنید و در پروژه خود استفاده کنید.
این ابزار مخصوصاً برای توسعهدهندگانی که میخواهند در زمان صرفهجویی کنند بسیار کاربردی است.
دیدگاهها