Cum să adaugi autentificare la un API Python — API Keys, JWT și OAuth2
In this tutorial, you'll learn about Cum să adaugi autentificare la un API Python. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.
Autentificarea API asigură că doar clienții autorizați pot accesa resursele tale. În acest ghid vei învăța trei metode populare de autentificare: API keys, JWT și OAuth2, implementate în Python cu FastAPI.
Problema
API-ul tău este public și oricine îl poate accesa. Fără autentificare, datele și serviciile tale sunt vulnerabile la acces neautorizat, atacuri și abuz.
Soluția Rapidă
1. Autentificare cu API Key
from fastapi import FastAPI, HTTPException, Header
app = FastAPI()
API_KEY = "secret-api-key-123"
@app.get("/date-securizate")
def date_securizate(x_api_key: str = Header(...)):
if x_api_key != API_KEY:
raise HTTPException(status_code=403, detail="Cheie API invalida")
return {"date": "date confidentiale"}
Testare:
curl -H "x-api-key: secret-api-key-123" http://localhost:8000/date-securizate
2. Autentificare cu JWT
pip install python-jose passlib bcrypt
from jose import jwt
from datetime import datetime, timedelta
SECRET = "cheie-secreta"
ALGORITM = "HS256"
def creeaza_token(user_id: int):
payload = {
"sub": str(user_id),
"exp": datetime.utcnow() + timedelta(hours=24)
}
return jwt.encode(payload, SECRET, algorithm=ALGORITM)
def verifica_token(token: str):
try:
payload = jwt.decode(token, SECRET, algorithms=[ALGORITM])
return payload["sub"]
except Exception:
raise HTTPException(status_code=401, detail="Token invalid sau expirat")
@app.post("/login")
def login(username: str, password: str):
if username == "admin" and password == "parola":
token = creeaza_token(user_id=1)
return {"access_token": token, "token_type": "bearer"}
raise HTTPException(status_code=401, detail="Credentiale incorecte")
@app.get("/profil")
def profil(authorization: str = Header(...)):
token = authorization.replace("Bearer ", "")
user_id = verifica_token(token)
return {"user_id": user_id, "profil": "Date utilizator"}
3. OAuth2 cu FastAPI
from fastapi.security import OAuth2PasswordBearer
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")
@app.get("/admin")
def admin(token: str = Depends(oauth2_scheme)):
user_id = verifica_token(token)
return {"mesaj": f"Bine ai venit, utilizatorul {user_id}"}
FastAPI generează automat butonul "Authorize" în Swagger UI pentru OAuth2.
Prevenție
- Stochează parolele ca hash BCrypt, nu în plain text
- Setează expiry time scurt pentru token-uri JWT (15-60 minute)
- Folosește HTTPS în producție pentru a preveni interceptarea token-urilor
- Nu include informații sensibile în payload-ul JWT (nu este criptat, doar semnat)
Greșeli Comune
- Stocarea API keys în codul sursă -- folosește variabile de mediu sau un vault
- Token JWT fără expiry -- token-urile perpetue sunt un risc major de securitate
- Transmiterea token-urilor în URL -- folosește header-ul
Authorization: Bearer - Ignorarea algoritmului de semnare -- setează explicit algoritmul, nu folosi
none - Stocarea parolelor în plain text -- folosește
passlibcubcryptpentru hashing
Exercițiu Practic
Implementează un API care protejează ruta GET /dashboard cu JWT. Adaugă un endpoint POST /auth/login care returnează un token valid 30 de minute.
FAQ
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro