Securizarea unei Aplicații Web prin Implementarea OAuth 2.0 și JWT

Configurare noua (How To)

Situatie

O aplicație web modernă trebuie să asigure:

  • Autentificare sigură (login)

  • Autorizare granulară (ce are voie să facă utilizatorul)

  • Protejarea resurselor sensibile

Cele mai utilizate standarde pentru asta sunt:

  • OAuth 2.0 – pentru autorizare între aplicații

  • JWT (JSON Web Tokens) – pentru transportul securizat al informațiilor de identitate.

Solutie

Diferențiere concepte

Concept Descriere succintă
Autentificare Confirmă cine ești (ești tu?)
Autorizare Decide ce poți face (ai voie să vezi/faci X?)
OAuth 2.0 Protocol pentru delegarea accesului
JWT Format de token semnat digital (autentificare)

Scenariu de lucru

Obiectiv:
Securizăm o aplicație RESTful cu:

  1. Login cu nume și parolă

  2. Obținere token JWT

  3. Acces la rute protejate doar dacă tokenul este valid

 Arhitectura generală

[User] --login--> [Auth Server] --generate--> [JWT]
--token--> [Protected API] --verify--> [Access Granted]

Pași de implementare (FastAPI + JWT)

Pasul 1: Instalare pachete

pip install fastapi uvicorn python-jose[cryptography] passlib[bcrypt]

Pasul 2: Generare token JWT

from jose import jwt
from datetime import datetime, timedelta

SECRET_KEY = "secreta_mea"
ALGORITHM = "HS256"

def create_access_token(data: dict, expires_delta: timedelta = None):
to_encode = data.copy()
expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15))
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

Pasul 3: Login și emitere token

from fastapi import FastAPI, Depends, HTTPException

app = FastAPI()

@app.post("/login")
def login(username: str, password: str):
if username == "admin" and password == "parola123":
token = create_access_token({"sub": username})
return {"access_token": token, "token_type": "bearer"}
raise HTTPException(status_code=401, detail="Invalid credentials")

Pasul 4: Verificarea tokenului pe rute protejate

from fastapi.security import OAuth2PasswordBearer
from jose import JWTError

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")

def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
return payload["sub"]
except JWTError:
raise HTTPException(status_code=401, detail="Invalid token")

@app.get("/protected")
def protected_route(user: str = Depends(get_current_user)):
return {"message": f"Bine ai venit, {user}!"}

Testare cu Postman sau curl

Pasul 1: Login

  • POST /login cu body {"username": "admin", "password": "parola123"}

Pasul 2: Acces la ruta protejată

  • GET /protected cu header:
    Authorization: Bearer <token primit>

Bune practici de securitate

Bună practică Motiv
Expirare tokenuri Limitarea duratei de acces
Reîmprospătare tokenuri Refresh token separat pentru sesiunile lungi
HTTPS obligatoriu Previne interceptarea tokenurilor
Salvare token doar în memorie Nu în localStorage (XSS!)
Semnături robuste Folosește chei lungi și algoritmi siguri

Extensii și aplicații avansate

Extensie Descriere
OAuth2 cu Google/Facebook Login prin rețele sociale (delegare reală)
Role-based access control Permisiuni pe roluri: admin, user, guest
API Gateway + Auth JWT verificat de gateway (ex: Kong, AWS API GW)
OpenID Connect Extensie OAuth 2.0 pentru autentificare completă

Tip solutie

Permanent

Voteaza

(3 din 5 persoane apreciaza acest articol)

Despre Autor

Leave A Comment?