import jwt from 'jsonwebtoken';
interface TokenPayload {
userId: string;
role: string;
}
// Zero-downtime JWT secret rotation pattern
export function verifyTokenWithRotation(token: string): TokenPayload {
const currentSecret = process.env.JWT_SECRET_CURRENT;
const previousSecret = process.env.JWT_SECRET_PREVIOUS;
if (!currentSecret) {
throw new Error('JWT_SECRET_CURRENT is missing from environment');
}
try {
// Always try verifying with the newest active key first
return jwt.verify(token, currentSecret) as TokenPayload;
} catch (err) {
// If payload was signed before key rotation, try previous secret
if (previousSecret) {
try {
return jwt.verify(token, previousSecret) as TokenPayload;
} catch {
throw new Error('Invalid token: failed both current and fallback secrets');
}
}
throw err;
}
}Dacă încă trimiți fișiere .env pe Slack sau le copiezi cu scp pe serverele de producție, avem o problemă. Am fost și eu acolo acum câțiva ani, la o aplicație cu 14 microservicii, unde schimbarea unei singure chei de Stripe dura două ore și necesita restart manual pe 5 instanțe diferit configurate.
În postarea asta scurtă îți spun cum am trecut de la haosul din .env la un pipeline curat de secrets management și ce trade-off-uri am găsit între Doppler și 1Password în producție.
De ce crapă varianta clasică cu .env pe disk
Toți începem la fel: un fișier .env.example comis în Git și un .env local pe care îl pasăm de la un dev la altul. Problema apare când echipa crește peste 5 oameni. Cineva adaugă un secret nou în staging, uită să anunțe pe canalul de dev, iar la următorul deploy producția crapă instant pentru că lipsește variabila.
Mai rău: rotația cheilor devine un coșmar pe care toată lumea îl evită. Dacă o cheie de API este compromisă, procesul de înlocuire dura la noi atât de mult încât amânam rotația cu lunile. Am văzut aplicații din producție care foloseau același JWT_SECRET generat acum 3 ani, ceea ce e o bombă cu ceas.
Doppler vs 1Password Secrets Automation
Anul trecut am migrat un proiect cu peste 20k utilizatori activi zilnic de la varianta de fișiere locale la un manager dedicat. Am testat intensiv două opțiuni: Doppler și 1Password Secrets Automation.
Doppler este pur și simplu genial pentru Developer Experience (DX). Pui doppler run -- npm start și procesul primește variabilele direct în memorie, fără să scrie niciun fișier pe disk. Tabloul de bord e curat, ai versionare automată și poți face rollback cu un singur click dacă o cheie a fost introdusă greșit.
În Kubernetes, Doppler sincronizează automat Secrets-urile native din Kube, ceea ce ne-a scutit de 30% din timpul pierdut pe scripturi custom de deployment. Trade-off-ul? Depinzi de disponibilitatea API-ului lor SaaS. Dacă Doppler are un outage (am pățit-o o dată în 2023), pipeline-ul tău de CI/CD din GitHub Actions nu mai poate face build decât dacă ai configurat un fallback local de stocare temporară.
1Password Secrets Automation este alegerea potrivită dacă firma ta folosește deja 1Password Enterprise. E integrat nativ cu vault-urile existente, iar permisiunile pentru service accounts sunt foarte granulare.
Trade-off-ul? DX-ul este mai rigid. Configurația de CLI necesită mai mulți pași de autentificare și setare de token-uri decât la Doppler, iar procesul de local development pare puțin mai greoi când vrei doar să pornești proiectul în 3 secunde.
Rotația cheilor fără downtime
Cea mai mare greșeală pe care o văd când se face rotația secretelor (de exemplu JWT_SECRET sau chei de criptare) este înlocuirea bruscă. Rezultatul? Toate sesiunile utilizatorilor existenți sunt invalidate instant sau decriptarea datelor vechi eșuează.
Strategia corectă pe care o folosesc este rotația în doi pași cu primary și fallback key. În cod, verifici semnătura mai întâi cu cheia nouă; dacă eșuează, încerci cu cheia veche înainte să arunci eroare. Astfel dai timp token-urilor vechi să expire natural fără să deloghezi userii.
Concluzie
Dacă ești într-o echipă mică sau medie și vrei viteză maximă fără bătăi de cap cu infrastructura, mergi pe Doppler. Câștigi timp enorm la onboarding. Dacă lucrezi într-un mediu enterprise cu audit strict și aveți deja 1Password peste tot, folosește 1Password Connect.
Voi cum gestionați distribuția de secrets în CI/CD? Mai aveți .env-uri uitate prin foldere Downloads?