Skip to main content

Specifikace autentizační hlavičky frontendu (interní otevření WebUI)

Při odesílání backendových požadavků musí frontend přečíst aktuální cookies webové stránky.

Cookies, které je nutné přečíst:

TMSESSNAME
X-Csrf-Token

Hlavičky požadavku musí obsahovat:

X-Csrf-Token: <X-Csrf-Token value read from cookie>
Cookie: TMSESSNAME=<TMSESSNAME value read from cookie>; X-Csrf-Token=<X-Csrf-Token value read from cookie>;

Příklad:

X-Csrf-Token: ltRoTGSICC68drxbvljhBeD2DZ7LPcge
Cookie: TMSESSNAME=46958db9-1f8a-4686-b340-34fd8ccf62e8; X-Csrf-Token=ltRoTGSICC68drxbvljhBeD2DZ7LPcge;

Příklad implementace na straně frontendu:

function getCookie(name) {
const prefix = encodeURIComponent(name) + "=";
return document.cookie
.split(";")
.map((item) => item.trim())
.find((item) => item.startsWith(prefix))
?.slice(prefix.length) || "";
}

const sessionName = getCookie("TMSESSNAME");
const csrfToken = getCookie("X-Csrf-Token");

const headers = {
"Content-Type": "application/json",
"X-Csrf-Token": csrfToken,
"Cookie": `TMSESSNAME=${sessionName}; X-Csrf-Token=${csrfToken};`
};
Poznámka
  1. Prohlížeče neumožňují frontendu ručně nastavit standardní hlavičku Cookie.
  2. Tato specifikace používá vlastní hlavičku Cookie pro předání zřetězeného řetězce cookie.
  3. Cookie je pevný název klíče a musí být zapsán přesně tak, jak vyžaduje platforma.
  4. Požadavky by měly zachovat credentials: "include".

Pokud backend potřebuje podporovat preflight požadavky prohlížeče, měl by povolit následující hlavičky:

Content-Type
X-Csrf-Token
Cookie

Poznámka k pojmenování hlavičky Cookie: Vlastní název hlavičky Cookie je interní pojmenovací konvencí platformy. Obchází omezení prohlížeče pro nastavení standardní hlavičky Set-Cookie v požadavcích JavaScript fetch/XHR. Tento název je pevný a nesmí se měnit — jakákoli odchylka naruší autentizaci.

Příklad ověření autentizace na straně backendu (Python):

def validate_auth(headers):
'''Validate the Cookie authentication header from frontend requests.'''
cookie_str = headers.get('Cookie', '')
csrf_token = headers.get('X-Csrf-Token', '')

# Parse Cookie header (format: key1=val1; key2=val2)
parts = {}
for part in cookie_str.split(';'):
if '=' in part:
k, v = part.strip().split('=', 1)
parts[k.strip()] = v.strip()

session_name = parts.get('TMSESSNAME', '')
cookie_csrf = parts.get('X-Csrf-Token', '')

if not session_name or not csrf_token:
return False
if csrf_token != cookie_csrf:
return False
# Validate session via TOS platform
return True

Příklad ověření autentizace na straně backendu (Go):

func validateAuth(r *http.Request) bool {
cookieStr := r.Header.Get("Cookie")
csrfToken := r.Header.Get("X-Csrf-Token")
if cookieStr == "" || csrfToken == "" {
return false
}
for _, part := range strings.Split(cookieStr, ";") {
kv := strings.SplitN(strings.TrimSpace(part), "=", 2)
if len(kv) == 2 && kv[0] == "X-Csrf-Token" {
if kv[1] != csrfToken {
return false
}
}
}
return true
}

Zpracování vypršení tokenu a zneplatnění relace:

  • Když autentizační token vyprší nebo se relace stane neplatnou, musí backend vrátit HTTP 401 Unauthorized
  • Frontend musí detekovat odpověď 401 a přesměrovat na přihlašovací stránku TOS
  • Nepokoušejte se o automatické obnovení tokenu; přesměrujte na / pro spuštění nové autentizace TOS
fetch('/v2/proxy/myapp/api', { credentials: 'include' })
.then(res => {
if (res.status === 401) {
window.location.href = '/'; // Redirect to TOS login
}
return res.json();
});