Această practică recomandă abandonarea soluțiilor de autentificare personalizate („homegrown”) în favoarea standardelor deschise, OAuth 2.1 și OpenID Connect (OIDC). Riscul principal este introducerea de vulnerabilități critice prin implementări incorecte ale logicii de tokenizare, gestionare a sesiunii sau validare a datelor. Ignorarea acestor standarde expune aplicația la atacuri precum CSRF, token leakage sau impersonare, în timp ce soluțiile standardizate oferă securitate testată comunitar și interoperabilitate nativă.
Cum o aplici
- Alege un Identity Provider (IdP): Folosește servicii mature precum Keycloak, Auth0, Azure AD sau Okta, care gestionează deja complexitatea OIDC/OAuth 2.1.
- Configurează fluxul corect: Pentru aplicații web moderne (SPA/React/Vue), utilizează Authorization Code Flow with PKCE. Evită Implicit Flow (periclitat) și Resource Owner Password Credentials (nu este recomandat pentru clienți publici).
- Validează token-urile la nivel de API: În backend-ul tău, configurează middleware-ul pentru a verifica semnătura (signature) și expirarea (exp claim) a JWT-urilor emise de IdP, nu pentru a gestiona sesiuni locale.
- Gestionează accesul granular: Utilizează scope-uri și resurse definite în OIDC pentru a controla permisiunile, nu logică custom în baza de date.
Exemplu
Varianta greșită (Custom Scheme): Stocarea parolelor hash-uite direct în baza de date și generarea manuală a unui token JWT fără verificare a semnăturii externe sau fără PKCE în client.
// GREȘIT: Validare simplistă, fără verificarea semnăturii emițătorului
if (req.headers.authorization === 'Bearer secret-token-123') {
return next();
}
Varianta corectă (OIDC + PKCE): Clientul solicita un cod de autorizare, îl schimbă pentru un access_token și validarea se face verificând cheia publică a IdP.
// CORECT: Middleware care validează JWT-ul semnat de IdP
const jwt = require('express-jwt');
const jwksRsa = require('jwks-rsa');
const auth = jwt({
secret: jwksRsa.expressJwtSecret({
cache: true,
rateLimit: true,
jwksRequestsPerMinute: 5,
jwksUri: "https://your-domain.auth0.com/.well-known/jwks.json"
}),
audience: 'https://api.yourapp.com',
issuer: 'https://your-domain.auth0.com/',
algorithms: ['RS256']
});
app.get('/protected', auth, (req, res) => {
res.send('Acces permis');
});
Cum verifici
- Audit de configurare: Verifică dacă fluxul utilizat este
authorization_codecucode_challenge(PKCE). - Teste de penetrare: Încearcă manipularea token-ului JWT (schimbarea algoritmului la
nonesau falsificarea semnăturii) pentru a vedea dacă API-ul respinge cererile. - Monitorizare: Configurează alerte pentru erori de validare a token-ului (
401 Unauthorized) ca indicator al încercărilor de acces neautorizat.
Greșeli frecvente
- Utilizarea Implicit Flow: Este considerat nesigur deoarece expune token-urile în URL și history-ul browserului.
- Ignorarea PKCE: Fără Proof Key for Code Exchange, un interceptor poate intercepta codul de autorizare și poate schimba token-ul.
- Validarea locală a parolelor: Stocarea sau transmiterea parolelor utilizatorului către API-ul de resurse în loc de a delega complet autentificarea către IdP.
Resurse gratuite
Alte subiecte din „Autentificare”
- Folosește fluxul Authorization Code cu PKCE pentru toți clienții
- Nu folosi fluxurile Implicit și Resource Owner Password Credentials
- Stochează parolele cu Argon2id sau bcrypt, niciodată în clar
- Oferă MFA și passkeys (WebAuthn) pentru conturile utilizatorilor
- Returnează mesaje generice la eșecul autentificării, fără enumerare de conturi
- Folosește token-uri de resetare a parolei unice, aleatorii și cu expirare scurtă
- Tratează cheile API ca secrete: scope limitat, rotație și revocare