Skip to content

Cum să adaugi autentificare la un API Python — API Keys, JWT și OAuth2

DodaTech Updated 2025-01-15 2 min read

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

  1. Stocarea API keys în codul sursă -- folosește variabile de mediu sau un vault
  2. Token JWT fără expiry -- token-urile perpetue sunt un risc major de securitate
  3. Transmiterea token-urilor în URL -- folosește header-ul Authorization: Bearer
  4. Ignorarea algoritmului de semnare -- setează explicit algoritmul, nu folosi none
  5. Stocarea parolelor în plain text -- folosește passlib cu bcrypt pentru 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

### Ce metodă de autentificare este cea mai sigură?

OAuth2 cu JWT este cea mai recomandată pentru API-uri moderne. Permite delegarea autentificării, refresh token-uri și integrare cu provideri terți (Google, GitHub).

API Key vs JWT — care este diferența?

API Key este o cheie statică, ideală pentru serviciu-la-serviciu. JWT este un token dinamic care conține informații despre utilizator și expiră după un timp.

Cum reîmprospătez un JWT expirat?

Folosește un refresh token separat, cu durată mai lungă, stocat în siguranță. Endpoint-ul /refresh primește refresh token-ul și returnează un access token nou.

Built by the developers of DodaTech

Doda Browser, DodaZIP & Durga Antivirus Pro