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};`
};
- Prohlížeče neumožňují frontendu ručně nastavit standardní hlavičku
Cookie. - Tato specifikace používá vlastní hlavičku
Cookiepro předání zřetězeného řetězce cookie. Cookieje pevný název klíče a musí být zapsán přesně tak, jak vyžaduje platforma.- 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();
});