🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
Zdroj pravdy:
src/server/authz/,src/shared/constants/publicApiRoutes.ts,src/lib/api/requireManagementAuth.ts,src/shared/utils/apiAuth.tsPoslední aktualizace: 2026-09-22 — jmenné prostory rozsahů odkazují na MCP-SERVER.md
OmniRoute používá autorizační řetězec zohledňující routy, který kontroluje každý požadavek API. Klasifikace je deterministická a fail-closed — cokoli, co nelze klasifikovat, spadá do kategorie MANAGEMENT a vyžaduje relaci nebo token s oprávněními pro správu. Tato stránka vysvětluje model určený technikům, kteří udržují routy nebo navrhují nové koncové body.
Zdroj: diagrams/authz-pipeline.mmd
Používá se pro klientská API kompatibilní s OpenAI/Anthropic/Gemini a několik tras pro správu, pokud má klíč oprávnění manage.
Authorization: Bearer <api-key>
Ověřuje se pomocí isValidApiKey() / extractApiKey() v src/sse/services/auth.ts a znovu se exportuje prostřednictvím src/shared/utils/apiAuth.ts. Validátor rovněž přijímá proměnné prostředí OMNIROUTE_API_KEY / ROUTER_API_KEY jako trvalé klíče pro předávání požadavků (problém #1350).
Pro stránky řídicího panelu a operace správce.
Cookie: auth_token=<JWT signed with JWT_SECRET>
Soubor cookie představuje relaci pouze tehdy, když je token JWT ověřen a obsahuje authenticated: true
(src/shared/utils/dashboardSessionToken.ts → verifyDashboardSessionToken). Každý
příjemce souboru cookie (ochrana trasy řídicího panelu (isDashboardSessionAuthenticated()), obnovení autorizačního kanálu, navázání spojení WebSocket, živý
server, /api/settings/require-login, /api/auth/status) používá tuto pomocnou funkci.
Existují i jiné tokeny JWT podepsané pomocí JWT_SECRET — předávání přes Cursor CLI razí
pro držitele klíčů tokeny iss "omniroute" / aud "cursor-cli" — ty však nikdy nepředstavují relace
(#13298).
Ověřuje se pomocí isDashboardSessionAuthenticated() v src/shared/utils/apiAuth.ts. Kanál automaticky obnoví token JWT, pokud do konce jeho 30denní platnosti zbývá méně než 7 dní.
Relace může skončit také před uplynutím 30 dní, protože každý vydavatel používá mintDashboardSessionToken (čas vydání iat a identifikátor jti) a ověřovací funkce kontroluje dvě nastavení: sessionsValidAfter, které se nastaví při změně hesla, takže všechny relace vydané před tímto okamžikem přestanou procházet ověřením (prohlížeč, ve kterém bylo heslo změněno, obdrží nový soubor cookie), a revokedDashboardSessions, do něhož POST /api/auth/logout přidá jti odhlášené relace. Relace vytvořené starší verzí neobsahují ani jeden z těchto nároků a zůstávají platné až do první změny hesla. Pokud nastavení nelze načíst, relace se nepovažuje za důvěryhodnou.
Některé trasy pro správu přijímají kterýkoli režim: soubor cookie NEBO Bearer <key>, pokud má klíč API oprávnění manage (nebo admin). To umožňuje pracovní postup „konfigurovatelný prostřednictvím volání API“, který byl přidán ve verzi v3.8.
Přihlášení správce do řídicího panelu podporuje vedle výchozího přihlášení heslem také volitelný tok OIDC (OpenID Connect) — přihlášení heslem není nikdy odstraněno, pouze doplněno:
- Zakázáno, pokud není splněno
settings.oidcEnabled === truea zároveň nejsou nakonfigurovány všechny položkyoidcIssuer/oidcClientId/oidcClientSecret(Nastavení → Autentizace). JinakGET /api/auth/oidc/loginvrátí400. GET /api/auth/oidc/loginzjistíauthorization_endpointz konfigurace/.well-known/openid-configurationvydavatele (případně použije<issuer>/authorize), sestaví URI přesměrování z příchozího požadavku (s podporoux-forwarded-proto) a přesměruje na IdP s náhodnou hodnotoustateuloženou v souboru cookieoidc_states příznakemhttpOnly.GET /api/auth/oidc/callbackověřístate, vymění autorizační kód a prostřednictvím JWKS vydavatele ověří podpis ID tokenu (createRemoteJWKSetz balíčkujose, ukládáno do mezipaměti podle URI JWKS) včetně kontrolissuer/audience. Přístup k ovládacímu panelu vyžaduje neprázdný seznamoidcAllowedSubjects, zásaduoidcAdmissionClaimnebo obojí. Seznam subjektů porovnávásubneboemail, ale pouze pokud platíemail_verified === true. Volitelná zásada deklarace používá cestu k deklaraci ID tokenu oddělenou tečkami (napříkladrealm_access.roles) a pole povolených hodnot; nalezená deklarace musí být pole řetězců obsahující alespoň jednu povolenou hodnotu. Pokud jsou nakonfigurovány obě zásady, musí obě uspět. Chybějící nebo chybně vytvořené deklarace vedou k bezpečnému zamítnutí a bez kterékoli z těchto zásad callback přihlášení odmítne (not_configured). Stávající konfigurace založené pouze na subjektu zůstávají beze změny.- Keycloak obvykle mapuje role sféry do přístupových tokenů, nikoli nutně do ID
tokenů. Chcete-li vyžadovat roli sféry
admin, nakonfigurujte pro tohoto klienta mapovač protokolu, který zahrnerealm_access.rolesdo jeho ID tokenu, a poté nastavteoidcAdmissionClaimna{ "path": "realm_access.roles", "values": ["admin"] }. Před povolením přístupu založeného pouze na roli zkontrolujte skutečnou deklaraci ID tokenu pro tohoto klienta; aplikace role z přístupového tokenu nečte. Odmítnutí tokenu na straně IdP může tuto kontrolu na straně aplikace doplnit, ale nenahrazuje ji. - Při úspěchu vytvoří naprosto stejný 30denní JWT
auth_token, jaký vydává přihlášení heslem (src/app/api/auth/login/route.ts), takže zbytek procesu relace ovládacího panelu (automatické obnovení, příznaky souboru cookie) zůstává beze změny — OIDC nahrazuje pouze způsob vytvoření souboru cookie, nikoli oprávnění, která uděluje. Změny rolí nebo skupin v IdP nezneplatní existující relace OmniRoute; jejich platnost nadále řídí odhlášení, změna hesla nebo vypršení relace. - Každé nastavení
oidc*(oidcEnabled,oidcDisablePasswordLogin,oidcIssuer,oidcClientId,oidcClientSecret,oidcAllowedSubjects,oidcAdmissionClaim,oidcRedirectPath,oidcScopes) je zahrnuto vSECURITY_IMPACTING_SETTINGS_KEYS(src/shared/constants/securityImpactingSettings.ts):PATCH /api/settingsodpoví400 PASSWORD_REQUIRED, pokud tělo neobsahuje heslo pro správu jakocurrentPassword(401 PASSWORD_MISMATCH, pokud je nesprávné).oidcDisablePasswordLoginzakáže přihlášení heslem (POST /api/auth/login), ale zachová uložený hash hesla a opětovné ověření stále kontrolujecurrentPasswordvůči tomuto hashi. corsOriginsabruteForceProtectionjsou také zahrnuty vSECURITY_IMPACTING_SETTINGS_KEYS: zmírnění kteréhokoli z nich oslabuje ochranu přihlášení, takže vyžadují stejné opětovné ověření pomocícurrentPassword(karta Zabezpečení jej vyžádá) a import JSON je vynechá.- Každý klíč zásad zabezpečení — položky
SECURITY_IMPACTING_SETTINGS_KEYS, každý klíčoidc*a stav relace ovládacího panelu — je uPATCH /api/settingsurčen pouze pro operátora: klíč API s rozsahem pro správu nebo přístupový tokenoma_je odmítnut s kódem403, i když odešle správnécurrentPassword, a odmítnutí se zaznamená do auditu jakosettings.update_failedsreason: OPERATOR_REQUIRED(requireOperatorCredential()vsrc/lib/api/operatorCredential.ts). Běžná nastavení (motiv vzhledu, předvolby zobrazení) může nadále zapisovat klíčmanagenebo přístupový tokenadmin. Každá změna samotného/api/settings(a také/api/settings/require-login) navíc vyžaduje rozsah přístupového tokenuadmin(ADMIN_MUTATION_EXACT_PATHSvsrc/server/authz/accessScopes.ts, přesná shoda cesty);GETzůstáváreada ostatní dílčí trasy/api/settings/*(proxy, výchozí hodnoty kombinací, aliasy modelů, komprese, promazávání…) si zachovávají rozsahwriteodvozený z metody. POST /api/settings/import-jsontoto opětovné ověření přeskakuje, a proto před zápisem odstraní každý klíč vIMPORT_STRIPPED_SETTINGS_KEYS(stejný soubor): heslo acurrentPassword, všechny položkySECURITY_IMPACTING_SETTINGS_KEYSa stav relace ovládacího panelu (sessionsValidAfter,revokedDashboardSessions). Import starší zálohy proto nemůže obnovit relaci, kterou již ukončila změna hesla nebo odhlášení.
src/server/authz/types.ts definuje tři třídy; každá trasa, kterou nelze jednoznačně zařadit, spadá do MANAGEMENT.
| Třída | Popis | Vyžadovaná autentizace |
|---|---|---|
PUBLIC |
Explicitně bezpečné trasy — přihlášení, odhlášení, stav, inicializace, health, bootstrap onboardingu. | Žádná |
CLIENT_API |
Koncové body pro obsluhu modelů — /api/v1/*, /api/v1beta/* a aliasy /v1/*, /v1beta/*, /chat/completions, /responses, /models, /codex/*. |
Bearer klíč, pokud je zapnuta efektivní feature flag REQUIRE_API_KEY |
MANAGEMENT |
Stránky panelu, nastavení, poskytovatelé, klíče, administrátorské a diagnostické koncové body. | Relace panelu NEBO Bearer s rozsahem manage |
Několik akcí MANAGEMENT je pouze pro operátora: klíč manage nestačí. Export uložených pověření (GET /api/settings/export-json, GET /api/db-backups/export, GET /api/db-backups/exportAll), obnovení zálohy přes živá data (POST /api/db-backups/import včetně dryRun=true, POST /api/db-backups obnovení podle id, POST /api/settings/import-json) a ničení bodů obnovy (úklid přes DELETE /api/db-backups a také PATCH /api/db-backups, protože uložená retence řídí automatické promazávání po každé záloze) vyžadují relaci panelu, lokální subjekt CLI nebo vypnuté přihlášení. Vydání tokenu synchronizace (POST /api/sync/tokens) a vytvoření přístupového tokenu CLI s rozsahem admin (POST /api/cli/tokens) vyžadují relaci panelu nebo lokální subjekt CLI ve všech režimech přihlášení. Klíče API libovolného rozsahu a přístupové tokeny oma_ nejsou operátorská pověření: pokud je vyžadováno operátorské pověření, dostanou 403. Kontrola je v src/lib/api/operatorCredential.ts (resolveOperatorCredential() / requireOperatorCredential()). Změna nastavení přihlášení je rovněž vyhrazena operátorovi: POST /api/settings/require-login (nastavení správcovského hesla / přepnutí requireLogin) přijme pouze tato pověření, jakmile heslo existuje — okno prvního spuštění (zatím bez hesla) zůstává beze změny — a relace panelu musí pro nahrazení hesla poslat currentPassword (403, pokud chybí nebo je špatné, audituje se jako settings.update_failed). Lokální CLI a instance s vypnutým přihlášením si zachovávají obnovovací cestu a mohou nastavit heslo bez něj, protože obě jsou vázány na hostitele, který vlastní datový adresář.
Incoming request → src/proxy.ts
→ runAuthzPipeline() in src/server/authz/pipeline.ts
1. Strip trusted internal headers (x-omniroute-auth-*, x-omniroute-route-class)
2. Generate request id, classify route via classifyRoute()
3. If pathname == "/" → redirect /dashboard
4. If draining (graceful shutdown) and /api/* → 503
5. If non-GET /api/* → checkBodySize() guard
6. If OPTIONS → CORS preflight 204
7. If options.enforce == false → pass-through with route-class headers
8. Otherwise: POLICIES[routeClass].evaluate(ctx)
- allow → stamp x-omniroute-auth-{kind,id,label,scopes} → NextResponse.next()
- reject → JSON error w/ correlation_id (dashboard pages → 302 /login)
Důvěryhodné interní hlavičky (definované v src/server/authz/headers.ts) jsou** odstraněny z příchozích požadavků** před klasifikací klienti — nemohou předem vyplnit x-omniroute-auth-*, aby se vydávali za subjekt.
Každá třída trasy má zásady v src/server/authz/policies/:
publicPolicy(policies/public.ts) — vždy vrátíallow({ kind: "anonymous", id: "anonymous" }).clientApiPolicy(policies/clientApi.ts) — extrahuje nosič, ověřuje přesvalidateApiKey(). Propadne na anonymní pouze tehdy, když je deaktivován efektivní příznak funkceREQUIRE_API_KEY. Efektivní příznak je vyřešen pomocíisRequireApiKeyEnabled()(DB feature flag override > process.env.REQUIRE_API_KEY > default), takže příznaky funkcí ovládacího panelu a proměnné prostředí řídí/api/v1/*,/api/v1beta/*a aliasy konzistentně; Selhání resolveru uzavřeno. Umožňuje požadavky na relaci řídicího panelu na klientských trasách API (včetně/api/v1/models, používaného v katalogu modelů řídicích panelů). Když je Entra ID SSO povolen, Nosič, který je strukturálně token Entra (tři segmenty base64url,RS*alg,kid), zpracovává větev SSO** před**validateApiKey()a jeho verdikt je konečný — nikdy neprojde cestou klíče API nebo větve degradace na anonymní, takže výpadek poskytovatele identity se nemůže stát otevřeným přístupem. Statické klávesy API nejsou ovlivněny. Viz Entra ID SSO.managementPolicy(policies/management.ts) — přijímá relaci řídicího panelu, požadavky na interní synchronizaci modelu (porovnané se/api/providers/[name]/(sync-models|models)) nebo zcela přeskakuje, pokudisAuthRequired()vrátí hodnotu false. Vrátí 403 (AUTH_001), když je token nositele přítomen, ale neplatný, jinak 401. Také vynucuje úrovně ochrany trasy (LOCAL_ONLY / ALWAYS_PROTECTED) před jakoukoli auth větví — viz vrstvy Route Guard. Cesty LOCAL_ONLY vLOCAL_ONLY_MANAGE_SCOPE_BYPASS_PREFIXES(dnes:/api/mcp/) mohou být přístupné z bez zpětné smyčky, když klíč Nosiče nese rozsahmanage; všechny ostatní cesty LOCAL_ONLY zůstávají striktně-loopback bez ohledu na rozsah.
Úspěšná politika vrátí AuthSubject s kind ∈ { client_api_key, dashboard_session, management_key, anonymous, sso_user }. Následné obslužné programy jej mohou číst prostřednictvím assertAuth(request, "CLIENT_API") v src/server/authz/assertAuth.ts namísto opětovného spouštění auth logiky.
src/shared/constants/publicApiRoutes.ts je explicitní seznam povolených tras:
Seznam je rozdělen podle tvaru a toto rozdělení je zásadní (GHSA-74g9-q8f6-793h): prefix se porovnává pomocí startsWith(), takže odpovídá také každé sousední cestě se stejnými počátečními znaky. Prefix /api/usage/om-usage označil /api/usage/om-usage<cokoli> jako VEŘEJNÉ a Next tuto cestu přeloží na /api/usage/[connectionId] — obslužnou rutinu bez vlastního ověřování.
// Skutečné podstromy. Každá položka MUSÍ končit znakem „/“ (ověřeno jednotkovým testem).
PUBLIC_API_ROUTE_PREFIXES = [
"/api/auth/oidc/",
"/api/v1/", // při klasifikaci se považuje za CLIENT_API, nikoli za veřejnou trasu bez ověřování
"/api/oauth/",
"/api/codex/connect/",
"/api/telegram/",
"/api/cursor-cli/",
];
// Jednotlivé trasy porovnávané PŘESNĚ (s koncovým lomítkem nebo bez něj).
PUBLIC_API_ROUTES_EXACT = new Set([
"/api/auth/login",
"/api/auth/logout",
"/api/auth/status",
"/api/init",
"/api/sync/bundle",
"/api/cli/connect",
"/api/usage/om-usage",
"/api/skills/collect/chaos",
]);
// Jednotlivé trasy pouze pro čtení, na které se vztahuje také zmírnění omezení původu CORS.
PUBLIC_READONLY_CORS_API_ROUTES = [
"/api/health/ping",
"/api/monitoring/health",
"/api/settings/require-login",
];
// Jednotlivá trasa pouze pro čtení BEZ zmírnění omezení CORS.
PUBLIC_READONLY_API_ROUTES_EXACT = new Set(["/api/health"]);
PUBLIC_READONLY_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);Trasy pouze pro čtení jsou veřejné jen pro bezpečné metody. Poznámka: classifyRoute() vylučuje /api/v1/* a /api/v1beta/* z výchozího zařazení mezi PUBLIC — tyto trasy jsou vždy CLIENT_API, takže se na ně nadále vztahují zásady pro Bearer klíče.
Trasy pod /api/v1/ a /api/v1beta/ jsou automaticky klasifikovány jako CLIENT_API. Middleware vynucuje kontrolu Bearer; obslužné rutiny tras ji nemusejí opakovat, ale mohou v případě potřeby načíst subjekt.
// src/app/api/v1/your-route/route.ts
import { NextRequest, NextResponse } from "next/server";
import { assertAuth } from "@/server/authz/assertAuth";
export async function POST(req: NextRequest) {
const subject = assertAuth(req, "CLIENT_API");
// subject.kind === "client_api_key" | "anonymous" | "dashboard_session"
// ... logika obslužné rutiny
}Použijte requireManagementAuth() ze souboru src/lib/api/requireManagementAuth.ts:
import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
export async function POST(request: Request) {
const rejection = await requireManagementAuth(request);
if (rejection) return rejection;
// ... logika obslužné rutiny
}Při úspěchu vrací requireManagementAuth() hodnotu null, jinak chybovou odpověď JSON typu Response:
- 401
AUTH_001„Je vyžadováno ověření“ — nejsou k dispozici žádné přihlašovací údaje - 403 — neplatný Bearer nebo je Bearer přítomen, ale klíč nemá rozsah
manage/admin
hasManageScope(scopes) vrací hodnotu true pro "manage" nebo "admin".
Sadu zvolte podle tvaru, nikoli podle pohodlnosti. Jedna trasa patří do PUBLIC_API_ROUTES_EXACT (nebo do PUBLIC_READONLY_CORS_API_ROUTES, pokud podporuje pouze GET); pouze skutečný podstrom patří do PUBLIC_API_ROUTE_PREFIXES a musí končit znakem /. Vložením jedné trasy do seznamu prefixů zveřejníte také každou sousední cestu se stejnými počátečními znaky — včetně sourozeneckých tras s dynamickými segmenty přidaných později (GHSA-74g9-q8f6-793h). Aktualizujte jednotkové testy v tests/unit/public-api-routes.test.ts, tests/unit/authz/public-route-exact-match.test.ts a tests/unit/authz/classify.test.ts.
Tři jmenné prostory. Každý kontrolní mechanismus čte pouze své vlastní řetězce. Porovnání vedle sebe,
včetně toho, proč manage nevyhoví funkci scopeMatches pro read:compression a proč
přístupový token s rozsahem read nemůže provést PATCH /api/keys/{id}, najdete v dokumentu
Tři jmenné prostory rozsahů.
Klíče API obsahují pole scopes (uložené jako JSON v api_keys.scopes, viz src/lib/db/apiKeys.ts).
manage/admin—hasManageScope. Přístup s tokenem Bearer k trasám rozhraní API pro správu.mcp:connect,self:usage,self:account-quotaapolicy:bypass-provider-quotajsou doplňkové rozsahy s přesnou shodou. Nacházejí se mimoMANAGEMENT_API_KEY_SCOPES.mcp:connectpovoluje pouze výjimku pro přístup k/api/mcp/mimo rozhraní loopback.
Katalog a pravidla porovnávání (identický řetězec nebo udělený rozsah končící znakem *):
Rozsahy nástrojů MCP.
MCP_SCOPE_LIST v src/shared/constants/mcpScopes.ts je původní typovaná
podmnožina, nikoli celý tento katalog. Vynucování probíhá v souboru
open-sse/mcp-server/scopeEnforcement.ts poté, co resolveCallerScopeContext()
zjistí rozsahy z ověřovacích údajů MCP, metadat požadavku nebo OMNIROUTE_MCP_SCOPES.
Zůstává vypnuté, pokud není nastaveno OMNIROUTE_MCP_ENFORCE_SCOPES=true.
read / write / admin u tokenů oma_live_…, seřazené funkcí scopeSatisfies
(src/lib/accessTokens/scopes.ts). Toto pořadí se vztahuje pouze na přihlašovací údaj
přístupového tokenu. Viz Ověřování pro správu.
isAuthRequired() v src/shared/utils/apiAuth.ts rozhoduje, zda se pro požadavek vynucuje jakákoli autentizace:
settings.requireLogin === false→ autentizace je globálně vypnuta, kromě trvale chráněné úrovně (viz Route Guard Tiers) a volání, která vydávají pověření, jež tato konfigurace přijímá; ta vyžadují stejné pověření jako při zapnutém přihlášení: vydávání tokenů synchronizace, vytváření přístupových tokenů CLI v libovolném rozsahu a vytváření klíče API s rozsahemmanage/admin, udělování tohoto rozsahu klíči, regenerace nebo zobrazení takového klíče (requireCredentialForManagementScopedKey()vsrc/lib/api/requireManagementAuth.ts). Klíče určené pouze pro inferenci zůstávají otevřené.- Není nastaveno žádné heslo a není nastavena proměnná prostředí
INITIAL_PASSWORD→ bootstrap režim povolí průvodce nastavením a požadavky z loopbacku, ale požadavky ze sítě stále vyžadují pověření. - Jakákoli chyba databáze → selhání uzavřené (secure-by-default).
Vynucení klientského API klíče používá isRequireApiKeyEnabled() v src/shared/utils/featureFlags.ts, nikoli přímé čtení process.env.REQUIRE_API_KEY. To je důležité pro nasazené instance: přepnutí REQUIRE_API_KEY v Dashboard → Feature Flags uloží přepsání do databáze a okamžitě ovlivní /v1/*, /v1beta/*, /models, /responses, /chat/completions, /codex/* a další kontroly autentizace klientského API, které sdílejí tento pomocník. Pokud nelze přečíst úložiště feature flagů, autentizace klientského API selže uzavřeně a vyžaduje klíč.
Koncové body /api/v1/agents/tasks/* a /api/resilience/model-cooldowns nyní vyžadují ověření pro správu (commit 588a0333). Klienti, kteří dříve odesílali běžný klíč API bez rozsahu oprávnění manage, obdrží 403. Migrace: buď klíči přidělte rozsah oprávnění manage na panelu API Keys, nebo použijte přihlášenou relaci panelu.
/api/mcp/* (vzdálený server MCP) je ve výchozím nastavení stále LOCAL_ONLY, ale nyní přijímá požadavky mimo zpětnou smyčku, pokud hlavička Authorization: Bearer <api-key> obsahuje rozsah oprávnění manage. Tato výjimka je explicitně povolována pro jednotlivé cesty prostřednictvím LOCAL_ONLY_MANAGE_SCOPE_BYPASS_PREFIXES v src/server/authz/routeGuard.ts; související prefix LOCAL_ONLY /api/cli-tools/runtime/* záměrně nelze obejít, protože může spouštět libovolné podprocesy. Anonymní požadavky na /api/mcp/* mimo zpětnou smyčku nadále vracejí 403 LOCAL_ONLY — výchozí nastavení pro každou novou cestu LOCAL_ONLY nadále striktně vyžaduje zpětnou smyčku. Viz Úrovně ochrany tras.
- Jednotkové testy:
tests/unit/authz/—classify.test.ts,pipeline.test.ts,client-api-policy.test.ts,management-policy.test.ts,public-policy.test.ts. - Veřejný seznam povolených položek:
tests/unit/public-api-routes.test.ts. - Spuštění vybraného testu:
node --import tsx/esm --test tests/unit/authz/classify.test.ts.
Potrubí vždy označí odpovědi:
x-request-id: <correlation id, echoed in error bodies>
x-omniroute-route-class: PUBLIC | CLIENT_API | MANAGEMENT
Pro autentizované požadavky upstream (na straně obslužné rutiny) hlavičky požadavků také zahrnují:
x-omniroute-auth-kind: client_api_key | dashboard_session | management_key | anonymous | sso_user
x-omniroute-auth-id: key_<last-4> | "dashboard" | "anonymous" | <entra-oid>
x-omniroute-auth-label: (optional)
x-omniroute-auth-scopes: comma-separated list
Použijte assertAuth(req, expectedClass) uvnitř obslužných rutin — to vyvolá AuthzAssertionError s kódem AUTHZ_NOT_INITIALIZED pokud byl middleware obejit (užitečné pro zachycení konfiguračních regresí v testech).
- API_REFERENCE.md — označení autentizace pro každý koncový bod
- COMPLIANCE.md — protokol auditu událostí autentizace
- MCP-SERVER.md — tři jmenné prostory rozsahů a katalog rozsahů nástrojů MCP
- Zdroj:
src/server/authz/,src/lib/api/requireManagementAuth.ts