JWT auth gồm bốn bước:
- Hash password với bcrypt
- Tạo JWT token khi login
- Verify token trong dependency
- Protect routes với
Depends(get_current_user)
Dùng PyJWT (không phải python-jose — đã có CVEs và ít được maintain).
python
from passlib.context import CryptContext
import jwt # pip install PyJWT
from datetime import datetime, timedelta, timezone
pwd = CryptContext(schemes=["bcrypt"])
SECRET = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
def create_token(user_id: int) -> str:
expire = datetime.now(timezone.utc) + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
return jwt.encode({"sub": str(user_id), "exp": expire}, SECRET, ALGORITHM)
async def get_current_user(token = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET, algorithms=[ALGORITHM])
uid = payload.get("sub")
if not uid: raise credentials_exception
except jwt.PyJWTError:
raise HTTPException(401, "Invalid token")
return await get_user(int(uid))