From e87d178d716027d3a8d7de5a93ca628fc1848dbf Mon Sep 17 00:00:00 2001 From: ZOMBIIIIIII <120676065+Metaton241@users.noreply.github.com> Date: Tue, 12 May 2026 12:37:38 +0300 Subject: [PATCH] fix: always fresh Vault login on each key rotation (was using expired startup token) --- apps/api/src/services/key-rotation.service.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/api/src/services/key-rotation.service.ts b/apps/api/src/services/key-rotation.service.ts index 2f1b393..b545d41 100644 --- a/apps/api/src/services/key-rotation.service.ts +++ b/apps/api/src/services/key-rotation.service.ts @@ -1,4 +1,4 @@ -import { env, getVaultToken } from '../config/env'; +import { env } from '../config/env'; import { vaultAppRoleLogin } from '../config/vault'; import { fetchJwtKeysFromVault, swapKeyMap, getKeyMapSize } from './jwt.service'; import { fetchCsrfConfig, swapCsrfConfig } from './csrf.service'; @@ -33,16 +33,14 @@ async function doRefresh(): Promise { return; } - // Каждый refresh — свежий Vault token. Старый optimisation с `currentVaultToken` - // был dead code (синхронный reset перед использованием). - let token = getVaultToken(); + // КАЖДЫЙ refresh — свежий AppRole login. Vault token TTL обычно ≤1 час, а refresh-интервал + // тоже ~1 час → кэшировать токен между tick'ами = expired token на 2-м tick → silent fail. + // Стоимость fresh login: один HTTP-запрос в час — пренебрежимо. Безопасность: гарантированно + // валидный токен для всех последующих fetches. + const token = await vaultAppRoleLogin(addr, roleId, secretId); if (!token) { - const fresh = await vaultAppRoleLogin(addr, roleId, secretId); - if (!fresh) { - logger.error('Key refresh: Vault AppRole login failed'); - return; - } - token = fresh; + logger.error('Key refresh: Vault AppRole login failed'); + return; } const jwtPromise = fetchJwtKeysFromVault(addr, token, mount, jwtKidPath, jwtKidsPrefix);