FastAPI তে JWT (JSON Web Token) ব্যবহার করে User Authentication করা একটি সাধারণ এবং শক্তিশালী পদ্ধতি। JWT-কে সাধারণত API Authentication এবং Authorization এর জন্য ব্যবহার করা হয়, যেখানে ক্লায়েন্ট এবং সার্ভারের মধ্যে নিরাপদভাবে ডাটা শেয়ার করা হয়। JWT ব্যবহার করে আপনি ব্যবহারকারীর লগইন সেশন ম্যানেজ করতে পারেন এবং ব্যবহারকারীর অনুমোদন (Authorization) যাচাই করতে পারেন।
এখানে, আমরা দেখব কিভাবে FastAPI তে JWT ব্যবহার করে ব্যবহারকারীর Authentication এবং Authorization তৈরি করা যায়।
Step 1: প্রয়োজনীয় লাইব্রেরি ইনস্টল করা
JWT ব্যবহার করার জন্য আমাদের PyJWT এবং passlib লাইব্রেরি ইনস্টল করতে হবে। passlib ব্যবহার করে আমরা ব্যবহারকারীর পাসওয়ার্ড হ্যাশিং করতে পারি।
pip install pyjwt passlib[bcrypt] fastapi uvicorn
Step 2: JWT Token Generation এবং User Authentication
প্রথমে, JWT টোকেন তৈরির জন্য একটি পদ্ধতি তৈরি করতে হবে এবং তারপর সেটি ব্যবহারকারীর লগইন করার সময় ব্যবহার করব।
উদাহরণ: JWT Token Generation
import jwt
from datetime import datetime, timedelta
from passlib.context import CryptContext
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.security import OAuth2PasswordBearer
from pydantic import BaseModel
from typing import Optional
# পাসওয়ার্ড হ্যাশিং কনটেক্সট
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
# JWT সিক্রেট কিওয়ার
SECRET_KEY = "mysecretkey"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
# FastAPI অ্যাপ শুরু করা
app = FastAPI()
# OAuth2PasswordBearer কনফিগারেশন
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")
# User Model
class User(BaseModel):
username: str
class UserInDB(User):
hashed_password: str
# Fake user data for demonstration
fake_users_db = {
"testuser": {
"username": "testuser",
"hashed_password": pwd_context.hash("testpassword")
}
}
# JWT টোকেন তৈরি করা
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
# ব্যবহারকারী যাচাই করা
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def get_user(db, username: str):
if username in db:
user_dict = db[username]
return UserInDB(**user_dict)
return None
# Token তৈরি করার পদ্ধতি
@app.post("/token")
async def login_for_access_token(form_data: OAuth2PasswordBearer):
user = get_user(fake_users_db, form_data.username)
if not user or not verify_password(form_data.password, user.hashed_password):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
access_token = create_access_token(
data={"sub": form_data.username}, expires_delta=access_token_expires
)
return {"access_token": access_token, "token_type": "bearer"}
উদাহরণ বর্ণনা:
create_access_token(): এই ফাংশনটি JWT টোকেন তৈরি করে এবং এর মধ্যেsub(subject),exp(expire time) যুক্ত করে।verify_password(): পাসওয়ার্ডের হ্যাশ যাচাই করার জন্য ব্যবহৃত হয়।get_user(): ফেক ডাটাবেস থেকে ব্যবহারকারী অনুসন্ধান করে।
এটি একটি সাধারণ login endpoint তৈরি করেছে যা JWT টোকেন ফিরিয়ে দেয়।
Step 3: JWT Token ব্যবহার করে Protected Endpoint
এখন, আমরা একটি protected endpoint তৈরি করব, যেখানে JWT টোকেন প্রয়োজন হবে।
উদাহরণ: Protected Endpoint
from fastapi import Depends
# JWT Token যাচাই করা
def get_current_user(token: str = Depends(oauth2_scheme)):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
return username
except jwt.PyJWTError:
raise credentials_exception
# Protected Route
@app.get("/users/me")
async def read_users_me(current_user: str = Depends(get_current_user)):
return {"username": current_user}
উদাহরণ বর্ণনা:
get_current_user(): এই ফাংশনটি JWT টোকেন যাচাই করে এবং এটি বৈধ হলে ব্যবহারকারীর তথ্য ফেরত পাঠায়।/users/me: একটি protected route যা ব্যবহারকারীকে তাদের নিজের তথ্য ফেরত দেয় যদি তারা একটি বৈধ JWT টোকেন প্রদান করে।
রিকোয়েস্ট উদাহরণ (JWT টোকেন সহ):
curl -X 'GET' \
'http://127.0.0.1:8000/users/me' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <JWT_TOKEN>'
Step 4: FastAPI-তে JWT Authorization Middleware (Optional)
FastAPI তে আপনি JWT যাচাই করার জন্য middleware ব্যবহার করতে পারেন, যা API-তে প্রতিটি রিকোয়েস্টের জন্য JWT টোকেন যাচাই করবে।
ফাস্টএপিআই তে JWT (JSON Web Token) ব্যবহার করে User Authentication একটি শক্তিশালী এবং সহজ উপায়। এটি API-তে নিরাপত্তা এবং অনুমোদন (Authorization) যাচাই করার জন্য আদর্শ। এই উদাহরণে দেখানো হয়েছে কিভাবে JWT টোকেন তৈরি, যাচাই এবং একটি protected endpoint ব্যবহার করা যায়, যা FastAPI এর মাধ্যমে শক্তিশালী এবং নিরাপদ ব্যবহারকারীর প্রমাণীকরণ প্রক্রিয়া নিশ্চিত করে।
Read more