FastAPI একটি নিরাপদ এবং দ্রুত API ডেভেলপমেন্ট ফ্রেমওয়ার্ক, যা নিরাপত্তা সংক্রান্ত বিভিন্ন ফিচার সরবরাহ করে। এর মধ্যে Password Hashing এবং Security Best Practices হল সিকিউর API এবং অ্যাপ্লিকেশন তৈরির জন্য অত্যন্ত গুরুত্বপূর্ণ।
এই পর্বে, আমরা FastAPI তে Password Hashing কিভাবে কার্যকরভাবে ব্যবহার করা যায় এবং Security Best Practices কী কী তা আলোচনা করব।
Password Hashing in FastAPI
Password Hashing হল পাসওয়ার্ড সুরক্ষিতভাবে সংরক্ষণ করার একটি গুরুত্বপূর্ণ প্রক্রিয়া। Hashing হল একটি একমুখী ফাংশন যা ইনপুট ডাটাকে নির্দিষ্ট দৈর্ঘ্যের স্ট্রিং (hash) এ রূপান্তরিত করে, যা পুনরায় মূল ইনপুট থেকে বের করা সম্ভব নয়। এটি পাসওয়ার্ড সংরক্ষণের নিরাপদ উপায়।
FastAPI তে password hashing করতে আপনি সাধারণত bcrypt বা passlib লাইব্রেরি ব্যবহার করতে পারেন। এখানে আমরা passlib ব্যবহার করব।
Step 1: Install passlib and bcrypt
প্রথমে passlib এবং bcrypt লাইব্রেরি ইনস্টল করুন:
pip install passlib[bcrypt]
Step 2: Password Hashing and Verification
এখন, আমরা Password Hashing এবং Verification কিভাবে করতে হয় তা দেখব।
from fastapi import FastAPI, Depends, HTTPException
from pydantic import BaseModel
from passlib.context import CryptContext
# FastAPI অ্যাপ তৈরি করা
app = FastAPI()
# CryptContext ইনস্ট্যান্স তৈরি
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# Pydantic মডেল তৈরি
class User(BaseModel):
username: str
password: str
# Password Hashing ফাংশন
def hash_password(password: str) -> str:
return pwd_context.hash(password)
# Password Verify ফাংশন
def verify_password(plain_password: str, hashed_password: str) -> bool:
return pwd_context.verify(plain_password, hashed_password)
# রেজিস্টার বা পাসওয়ার্ড হ্যাশ করা
@app.post("/register/")
def register_user(user: User):
hashed_password = hash_password(user.password)
return {"username": user.username, "hashed_password": hashed_password}
# লগইন বা পাসওয়ার্ড ভেরিফাই করা
@app.post("/login/")
def login_user(user: User):
stored_hashed_password = "existing_hashed_password_from_db" # ডাটাবেস থেকে আসবে
if not verify_password(user.password, stored_hashed_password):
raise HTTPException(status_code=400, detail="Incorrect password")
return {"message": "Login successful"}
এখানে:
hash_password: পাসওয়ার্ডটি হ্যাশ করে দেয়।verify_password: পাসওয়ার্ডটি হ্যাশের সাথে মিলিয়ে দেখে।
এভাবে, পাসওয়ার্ড কখনো ডাটাবেসে প্লেইন টেক্সট হিসেবে সংরক্ষিত হবে না, বরং হ্যাশ করা থাকবে।
Step 3: Testing Password Hashing and Verification
রিকোয়েস্ট উদাহরণ (Register):
POST /register/
{
"username": "john_doe",
"password": "supersecretpassword"
}
রেসপন্স:
{
"username": "john_doe",
"hashed_password": "$2b$12$VxZfJ7ak0Yf6TG7Yl6UuBeXgtISohDq8fN76Y5.O3YFhFQhciHHKi" # Example hash
}
রিকোয়েস্ট উদাহরণ (Login):
POST /login/
{
"username": "john_doe",
"password": "supersecretpassword"
}
রেসপন্স:
{
"message": "Login successful"
}
এখানে, পাসওয়ার্ডটি হ্যাশ করা হয়েছে এবং যাচাই করার সময় পাসওয়ার্ডের হ্যাশটি ডাটাবেসে সংরক্ষিত থাকা একটি স্টোরড হ্যাশের সাথে মিলানো হয়েছে।
Security Best Practices in FastAPI
FastAPI তে সিকিউরিটি নিশ্চিত করার জন্য কিছু গুরুত্বপূর্ণ সেরা অনুশীলন বা Best Practices রয়েছে।
1. JWT Authentication (JSON Web Tokens)
FastAPI তে JWT ব্যবহার করে সুরক্ষিত অথেনটিকেশন করা যায়। JWT টোকেন দিয়ে আপনি ইউজারের সেশন ট্র্যাক করতে পারেন এবং API রিকোয়েস্টে অথেনটিকেশন নিশ্চিত করতে পারেন।
JWT Example:
pip install pyjwt
import jwt
from fastapi import FastAPI, Depends, HTTPException
from datetime import datetime, timedelta
from pydantic import BaseModel
app = FastAPI()
# Secret key
SECRET_KEY = "mysecretkey"
ALGORITHM = "HS256"
# Token Model
class Token(BaseModel):
access_token: str
token_type: str
# JWT Token Create
def create_access_token(data: dict, expires_delta: timedelta | None = None):
to_encode = data.copy()
if expires_delta:
expire = datetime.utcnow() + expires_delta
else:
expire = datetime.utcnow() + timedelta(minutes=15)
to_encode.update({"exp": expire})
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return encoded_jwt
@app.post("/token/", response_model=Token)
def login_for_access_token():
access_token_expires = timedelta(minutes=30)
access_token = create_access_token(data={"sub": "john_doe"}, expires_delta=access_token_expires)
return {"access_token": access_token, "token_type": "bearer"}
2. CORS (Cross-Origin Resource Sharing)
CORS (Cross-Origin Resource Sharing) কনফিগারেশন ব্যবহার করে আপনি নির্দিষ্ট ডোমেইন বা URL গুলোকে আপনার API অ্যাক্সেস দিতে পারেন। FastAPI-তে CORS কনফিগারেশন খুবই সহজ।
CORS Example:
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
origins = ["https://example.com", "https://www.example.com"]
app.add_middleware(
CORSMiddleware,
allow_origins=origins, # বা ["*"] সবার জন্য
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
3. Use HTTPS in Production
প্রোডাকশন পরিবেশে HTTP ব্যবহার না করে HTTPS ব্যবহার করা উচিত। HTTPS সার্ভার সেটআপ করা হলে সমস্ত ডাটা এনক্রিপ্টেড থাকবে, যা সিকিউর কমিউনিকেশন নিশ্চিত করে।
4. Rate Limiting
API-তে অতিরিক্ত রিকোয়েস্ট আটকাতে Rate Limiting ব্যবহার করা উচিত। FastAPI তে থার্ড-পার্টি লাইব্রেরি যেমন slowapi ব্যবহার করে আপনি রেট লিমিটিং অ্যাপ্লিকেশনে প্রয়োগ করতে পারেন।
pip install slowapi
5. Protect Sensitive Data (Environment Variables)
সেন্সিটিভ ডাটা (যেমন ডাটাবেস ক্রেডেনশিয়াল বা API কী) .env ফাইলে সংরক্ষণ করা উচিত। python-dotenv ব্যবহার করে আপনি এন্ডপয়েন্ট বা অন্যান্য কনফিগারেশন থেকে এগুলো লোড করতে পারেন।
pip install python-dotenv
FastAPI তে Password Hashing এবং Security Best Practices ব্যবহার করে আপনি একটি সুরক্ষিত এবং দ্রুত API তৈরি করতে পারেন। Password Hashing পাসওয়ার্ড সুরক্ষিতভাবে সংরক্ষণ এবং যাচাই করতে সাহায্য করে, আর JWT Authentication ব্যবহার করে সুরক্ষিত অথেনটিকেশন ব্যবস্থা তৈরি করা যায়। এছাড়া CORS, HTTPS, Rate Limiting, এবং Environment Variables এর মতো সিকিউরিটি সেরা অনুশীলনগুলি আপনার অ্যাপ্লিকেশনকে আরও নিরাপদ করে তোলে।
Read more