AXIOS s využitím Trezoru

Tento článek popisuje, jak ve výpočtech TAS bezpečně volat externí API přes knihovnu axios a přitom použít tajné klíče uložené ve Vaultu (servisní tokeny, API klíče, hesla). Vault je dostupný od verze TAS 5.17.

Funkce vault.* a axios.setVaultHeader / setVaultQueryParam / requestWithVaultField jsou k dispozici od TAS 5.17. Na starších instalacích (5.7 a níže) vault namespace neexistuje — ověř verzi instalace klienta před použitím.

Ve výpočtech TAS nikdy nepoužívej async / await / Promise / .then(). TAS provádí vlastní transpilaci kódu a async syntaxe vede k tichému selhání výpočtu. Všechna volání vault.get() i axios jsou synchronní — výsledek vracejí přímo.

Princip — proč Vault místo hardcoded klíče

Funkce vault.get('NAZEV') nevrací tajný klíč jako čitelný text, ale tzv. opaque referenci (VaultSecretRef). Tuto referenci nelze zalogovat, serializovat ani vypsat — pokus o JSON.stringify, .toString() nebo zápis do proměnné vrátí pouze [VaultSecretRef].

Důsledek: referenci z vault.get() předáváš pouze do důvěryhodných funkcí, které ji umí zpracovat — setVaultHeader, setVaultQueryParam, requestWithVaultField a requestRawWithVaultField. Nikam jinam.

Předpoklady

  • TAS verze 5.17 nebo vyšší,
  • tajný klíč založený ve Vaultu (Administrace → Vault) pod konkrétním názvem,

Základní postup

Použití Vaultu s axiosem má vždy tři kroky:

  1. Načti referenci na secret přes vault.get('NAZEV_SECRETU').
  2. Vytvoř klienta přes axios.getAxios({ baseURL }).
  3. Dosad' referenci do požadavku jednou z vault metod (setVaultHeader / setVaultQueryParam / requestWithVaultField).

Minimální příklad — Bearer token v hlavičce Authorization:

// 1) reference na secret z Vaultu
const tokenRef = vault.get('EXTERNAL_API_TOKEN');

// 2) klient s base URL + 3) dosazení tokenu do hlavičky
const client = axios.getAxios({ baseURL: 'https://api.partner.com/v2' })
.setVaultHeader('Authorization', tokenRef, 'Bearer ');

// volání — token TAS dosadí interně až teď
const response = client.get('/users/42');
return response.data;

Tři způsoby dosazení secretu

Podle toho, kam API tajemství očekává, vyber odpovídající metodu.

Nejčastější případ: Bearer token nebo API klíč v hlavičce. Hlavička se přidá ke všem následným požadavkům daného klienta.

// setVaultHeader(nazevHlavicky, secretRef, prefix?)
const apiKeyRef = vault.get('PARTNER_API_KEY');

const client = axios.getAxios({ baseURL: 'https://api.partner.com' })
.setVaultHeader('x-api-key', apiKeyRef); // bez prefixu
// nebo s prefixem: .setVaultHeader('Authorization', apiKeyRef, 'Bearer ');

const response = client.get('/protected-resource');
return response.data;
Třetí parametr je volitelný prefix, který se vloží před hodnotu secretu — typicky 'Bearer ' nebo 'bearer ' (včetně mezery na konci).

2. Do query parametru — setVaultQueryParam

Pro API, která očekávají klíč v URL (např. ?apiKey=...). Parametr se automaticky připojí ke každému požadavku klienta.

const apiKeyRef = vault.get('PUBLIC_API_KEY');

const client = axios.getAxios({ baseURL: 'https://api.example.com' })
.setVaultQueryParam('apiKey', apiKeyRef);

// každý request automaticky obsahuje ?apiKey=<resolved-secret>
const response = client.get('/results');
return response.data;

3. Do těla požadavku — requestWithVaultField

Když API očekává tajemství přímo v těle (typicky OAuth2 client_credentials flow s client_secret). Secret se vloží do zadaného pole v data, aniž by prošel kódem.

const clientSecretRef = vault.get('OAUTH_CLIENT_SECRET');

const client = axios.getAxios({ baseURL: 'https://auth.example.com' });

// requestWithVaultField(config, [{ fieldName, ref }])
const tokens = client.requestWithVaultField(
{
method: 'POST',
url: '/oauth/token',
data: {
grant_type: 'client_credentials',
client_id: 'tas-service'
}
},
[{ fieldName: 'client_secret', ref: clientSecretRef }]
);

return tokens.data.access_token;
Pole zadané v fieldName (zde client_secret) se do těla doplní automaticky — nezapisuj ho ručně do objektu data.

Plná odpověď — requestRawWithVaultField

Pokud potřebuješ kromě dat i status, statusText nebo hlavičky odpovědi, použij raw variantu. Dostupné od v5.7.37 (raw varianty axiosu), vault pole od 5.17.

const secretRef = vault.get('SERVICE_PASSWORD');

const client = axios.getAxios({ baseURL: 'https://api.example.com' });

const raw = client.requestRawWithVaultField(
{
method: 'POST',
url: '/login',
data: { username: 'tas-service' }
},
[{ fieldName: 'password', ref: secretRef }]
);

if (raw.status !== 200) {
proc.error('Login selhal', { status: raw.status });
debug.error('Přihlášení k externí službě selhalo.');
}

return raw.data;

Kompletní příklad — OAuth2 token a navazující volání

Typický scénář: získání access tokenu přes client_secret z Vaultu a jeho použití pro autorizované volání.

// 1) reference na client secret
const clientSecretRef = vault.get('OAUTH_CLIENT_SECRET');

const auth = axios.getAxios({ baseURL: 'https://auth.service.com' });

// 2) výměna za access token (secret v těle)
const tokenResp = auth.requestWithVaultField(
{
method: 'POST',
url: '/token',
data: { grant_type: 'client_credentials', client_id: 'tas-service' }
},
[{ fieldName: 'client_secret', ref: clientSecretRef }]
);

const accessToken = tokenResp.data.access_token;

// 3) autorizované volání s tokenem v hlavičce
const api = axios.getAxios({ baseURL: 'https://api.service.com' })
.setVaultHeader('Authorization', accessToken, 'Bearer ');

const me = api.get('/me');
return me.data;

Logování a ošetření chyb

Ve výpočtech TAS loguj výhradně přes proc.info / proc.warn / proc.errornikdy console.log. Pro zablokování úkolu s chybovou hláškou použij debug.error.

const tokenRef = vault.get('EXTERNAL_API_TOKEN');
const client = axios.getAxios({ baseURL: 'https://api.example.com' })
.setVaultHeader('Authorization', tokenRef, 'Bearer ');

try {
const resp = client.post('/users', { email: vars['EMAIL'].getValue() });
return resp.data;
} catch (err) {
proc.error('Volání API selhalo', { message: err.message });
debug.error('Nepodařilo se vytvořit uživatele v externím systému.');
}
Reference z vault.get() je bezpečné předat do proc.* i do chybové hlášky — vždy se zobrazí jen jako [VaultSecretRef], nikdy jako čitelná hodnota.

Co nedělat

Anti-pattern

Proč je špatně

const token = 'eyJhb...';

Hardcoded tajemství v kódu — uniká v exportu šablony i v logu. Vždy vault.get().

await axios.getAxios()...

async/await koliduje s transpilací TAS → tiché selhání. Volej synchronně.

vars['X'].setValue(tokenRef)

Uložení reference do proměnné nemá smysl — hodnota se neuloží, vrátí se [VaultSecretRef].

Secret v data ručně

Tajemství zapsané přímo do těla projde kódem. Použij requestWithVaultField.

Řešení potíží

Problém

Řešení

vault is not defined

Instalace běží na verzi nižší než 5.15. Ověř verzi TAS; na starších verzích řeš tokeny přes StorageApi nebo šifrovanou konfiguraci.

Secret 'NAZEV' not found

Secret není ve Vaultu založen, nebo šablona/skript nemá povolen přístup. Zkontroluj Administrace → Vault.

401 Unauthorized

Ověř, že hodnota secretu je správná a nevypršela, a že prefix v setVaultHeader odpovídá (např. 'Bearer ' s mezerou).

Výpočet tiše „nic nedělá"

Téměř jistě async/await nebo .then() v kódu. Přepiš na synchronní volání.

Frantisek Brych Updated by Frantisek Brych

AXIOS API

Contact

Team assistant (opens in a new tab)

Powered by HelpDocs (opens in a new tab)