🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇧🇦 bs · 🇨🇿 cs · 🇩🇰 da · 🇩🇪 de · 🇬🇷 el · 🇪🇸 es · 🇮🇷 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
Tõe allikas:
src/server/authz/,src/shared/constants/publicApiRoutes.ts,src/lib/api/requireManagementAuth.ts,src/shared/utils/apiAuth.tsViimati uuendatud: 2026-09-22 — skoobi nimeruumid viitavad MCP-SERVER.md
OmniRoute'il on marsruuditundlik autoriseerimistorustik, mis valvab iga API päringut. Klassifikatsioon on deterministlik ja fail-closed — kõik, mida ei saa klassifitseerida, lõpeb MANAGEMENTina ja nõuab seanssi või haldustaseme tokenit. See leht selgitab mudelit inseneridele, kes hooldavad marsruute või kujundavad uusi lõpp-punkte.
Allikas: diagrams/authz-pipeline.mmd
Kasutatakse OpenAI/Anthropicu/Gemini ühilduvate kliendi-API-de ja mõne haldusmarsruudi puhul, kui võtmel on ulatus manage.
Authorization: Bearer <api-key>
Seda valideerivad isValidApiKey() / extractApiKey() failis src/sse/services/auth.ts ning need eksporditakse uuesti faili src/shared/utils/apiAuth.ts kaudu. Valideerija aktsepteerib ka keskkonnamuutujaid OMNIROUTE_API_KEY / ROUTER_API_KEY püsivate läbipääsuvõtmetena (probleem #1350).
Töölaua lehtede ja administraatoritoimingute jaoks.
Cookie: auth_token=<JWT signed with JWT_SECRET>
Küpsis on seanss ainult siis, kui JWT kontrollimine õnnestub ja see sisaldab väärtust authenticated: true
(src/shared/utils/dashboardSessionToken.ts → verifyDashboardSessionToken). Iga
küpsise kasutaja (marsruudivalvur, AuthZ-konveieri värskendamine, WebSocketi käepigistus, reaalajas
server, /api/settings/require-login, /api/auth/status) kasutab seda abifunktsiooni.
On olemas ka teisi võtmega JWT_SECRET allkirjastatud JWT-sid — Cursor CLI läbipääsumehhanism väljastab
võtmeomanikele lubasid väärtustega iss "omniroute" / aud "cursor-cli" — ning neid ei käsitleta kunagi seanssidena
(#13298).
Seda kontrollib isDashboardSessionAuthenticated() failis src/shared/utils/apiAuth.ts. Konveier värskendab JWT-d automaatselt, kui selle 30-päevasest kehtivusajast on jäänud vähem kui 7 päeva.
Mõned haldusmarsruudid aktsepteerivad mõlemat režiimi: küpsist VÕI Bearer <key>, kui API-võtmel on ulatus manage (või admin). See võimaldab versioonis v3.8 lisatud töövoogu „konfigureeritav API-kutsete kaudu“.
Töölaua administraatori sisselogimine toetab lisaks vaikimisi parooliga sisselogimisele ka valikulist OIDC (OpenID Connecti) voogu — parooliga sisselogimist ei eemaldata kunagi, seda ainult täiendatakse:
- See on keelatud, välja arvatud juhul, kui
settings.oidcEnabled === truejaoidcIssuer/oidcClientId/oidcClientSecreton kõik konfigureeritud (Settings → Auth). Vastasel juhul tagastabGET /api/auth/oidc/loginolekukoodi400. GET /api/auth/oidc/logintuvastab väljaandja/.well-known/openid-configurationkauduauthorization_endpoint-i (varuvariandina kasutatakse<issuer>/authorize), koostab ümbersuunamise URI sissetuleva päringu põhjal (arvestadesx-forwarded-protoväärtust) ning suunab kasutaja ümber IdP-sse juhuslikustate-väärtusega, mis salvestataksehttpOnly-atribuudigaoidc_state-küpsisesse.GET /api/auth/oidc/callbackvalideeribstate-väärtuse, vahetab autoriseerimiskoodi ning kontrollib ID-loa allkirja väljaandja JWKS-i kaudu (josefunktsiooncreateRemoteJWKSet, vahemällu salvestatud iga JWKS-i URI kohta), kontrollides väärtusiissuer/audience. ValikulineoidcAllowedSubjectslubatud väärtuste loend võrdleb loasub-nõuet või selleemail-nõuet — e-posti nõuet arvestatakse ainult siis, kuiemail_verified === true, mistõttu ei saa IdP-s kinnitamata e-posti aadress kunagi väravat läbida.- Õnnestumise korral väljastatakse täpselt sama 30-päevane
auth_tokenJWT, mille väljastab parooliga sisselogimine (src/app/api/auth/login/route.ts), seega jääb ülejäänud töölaua seansikonveier (automaatne värskendamine, küpsise lipud) muutumatuks — OIDC asendab ainult küpsise väljastamise viisi, mitte selle antavaid õigusi.
src/server/authz/types.ts määratleb kolm klassi; iga marsruut, mida ei saa deterministlikult klassifitseerida, liigitatakse vaikimisi klassi MANAGEMENT.
| Klass | Kirjeldus | Nõutav autentimine |
|---|---|---|
PUBLIC |
Selgesõnaliselt turvalised marsruudid — sisselogimine, väljalogimine, olek, lähtestamine, tervisekontroll, kasutuselevõtu alglaadimine. | Puudub |
CLIENT_API |
Mudelite teenindamise lõpp-punktid — /api/v1/*, /api/v1beta/* ning aliased /v1/*, /v1beta/*, /chat/completions, /responses, /models, /codex/*. |
Bearer-võti, kui kehtiv funktsioonilipp REQUIRE_API_KEY on lubatud |
MANAGEMENT |
Töölaua lehed, sätted, pakkujad, võtmed ning administraatori- ja diagnostikalõpp-punktid. | Töölaua seanss VÕI manage-ulatusega Bearer |
Sissetulev päring → src/proxy.ts
→ runAuthzPipeline() failis src/server/authz/pipeline.ts
1. Eemalda usaldatud sisemised päised (x-omniroute-auth-*, x-omniroute-route-class)
2. Genereeri päringu ID, klassifitseeri marsruut funktsiooniga classifyRoute()
3. Kui pathname == "/" → suuna ümber asukohta /dashboard
4. Kui toimub tühjendamine (sujuv sulgemine) ja /api/* → 503
5. Kui mitte-GET /api/* → kontrolli kaitsemehhanismiga checkBodySize()
6. Kui OPTIONS → CORS-i eelkontroll 204
7. Kui options.enforce == false → lase läbi koos marsruudiklassi päistega
8. Vastasel juhul: POLICIES[routeClass].evaluate(ctx)
- luba → lisa x-omniroute-auth-{kind,id,label,scopes} → NextResponse.next()
- lükka tagasi → JSON-viga koos correlation_id-ga (töölaua lehed → 302 /login)
Usaldatud sisemised päised (määratletud failis src/server/authz/headers.ts) eemaldatakse sissetulevatest päringutest enne klassifitseerimist — kliendid ei saa subjekti kehastamiseks päiseid x-omniroute-auth-* eelnevalt määrata.
Igal marsruudiklassil on kataloogis src/server/authz/policies/ oma reeglistik:
publicPolicy(policies/public.ts) — tagastab alatiallow({ kind: "anonymous", id: "anonymous" }).clientApiPolicy(policies/clientApi.ts) — eraldab Bearer-väärtuse ja valideerib selle funktsioonigavalidateApiKey(). Lubab anonüümse juurdepääsu ainult siis, kui kehtiv funktsioonilippREQUIRE_API_KEYon keelatud. Kehtiv lipp tuvastatakse funktsioonigaisRequireApiKeyEnabled()(andmebaasi funktsioonilipu ülekirjutus > process.env.REQUIRE_API_KEY > vaikeväärtus), et töölaua funktsioonilipud ja keskkonnamuutujad haldaksid marsruute/api/v1/*,/api/v1beta/*ning aliaseid ühetaoliselt; lahendaja tõrgete korral juurdepääs keelatakse. Lubab kliendi API marsruutidel töölaua seansiga päringuid (sealhulgas/api/v1/models, mida kasutab töölaua mudelikataloog).managementPolicy(policies/management.ts) — aktsepteerib töölaua seanssi ja sisemisi mudelite sünkroonimise päringuid (mida võrreldakse mustriga/api/providers/[name]/(sync-models|models)) või jätab kontrolli täielikult vahele, kuiisAuthRequired()tagastab väärväärtuse. Kui Bearer-tõend on olemas, kuid kehtetu, tagastab 403 (AUTH_001), muul juhul 401. Samuti jõustab enne mis tahes autentimisharu marsruudikaitse tasemed (LOCAL_ONLY / ALWAYS_PROTECTED) — vt Marsruudikaitse tasemed. LoendisLOCAL_ONLY_MANAGE_SCOPE_BYPASS_PREFIXESolevatele LOCAL_ONLY teedele (praegu/api/mcp/) pääseb juurde ka väljastpoolt loopback-liidest, kui Bearer-võtmel onmanage-ulatus; kõik muud LOCAL_ONLY teed jäävad olenemata ulatusest rangelt loopback-liidesega piiratuks.
Edukas reeglistik tagastab AuthSubject-objekti väärtusega kind ∈ { client_api_key, dashboard_session, management_key, anonymous }. Allavoo töötlejad saavad seda lugeda failis src/server/authz/assertAuth.ts oleva funktsiooni assertAuth(request, "CLIENT_API") kaudu, selle asemel et autentimisloogikat uuesti käivitada.
src/shared/constants/publicApiRoutes.ts on selgesõnaline lubatud marsruutide loend:
Loend on jaotatud kuju järgi ning see jaotus on kriitilise tähtsusega (GHSA-74g9-q8f6-793h): prefiks sobitatakse meetodiga startsWith(), mistõttu sobib see ka iga külgneva teega, mille algusmärgid on samad.
Prefiksina märkis /api/usage/om-usage marsruudi /api/usage/om-usage<anything> AVALIKUKS ning Next lahendab selle marsruudiks /api/usage/[connectionId] — töötlejaks, millel puudub oma autentimine.
// Tegelikud alampuud. Iga kirje PEAB lõppema märgiga "/" (seda kontrollib ühiktest).
PUBLIC_API_ROUTE_PREFIXES = [
"/api/auth/oidc/",
"/api/v1/", // käsitletakse funktsioonis classify kui CLIENT_API, mitte kui „autentimiseta avalikku“
"/api/oauth/",
"/api/codex/connect/",
"/api/telegram/",
"/api/cursor-cli/",
];
// Üksikud marsruudid, mida sobitatakse TÄPSELT (lõpukaldkriipsuga või ilma).
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",
]);
// Kirjutuskaitstud üksikud marsruudid, millele rakendub ka CORS-i päritolupiirangu leevendus.
PUBLIC_READONLY_CORS_API_ROUTES = [
"/api/health/ping",
"/api/monitoring/health",
"/api/settings/require-login",
];
// Kirjutuskaitstud üksik marsruut ILMA CORS-i piirangu leevenduseta.
PUBLIC_READONLY_API_ROUTES_EXACT = new Set(["/api/health"]);
PUBLIC_READONLY_METHODS = new Set(["GET", "HEAD", "OPTIONS"]);Kirjutuskaitstud marsruudid on avalikud ainult turvaliste meetodite puhul. Märkus: classifyRoute() välistab /api/v1/* ja /api/v1beta/* PUBLIC-i vaikimisi harust — need on alati CLIENT_API, et Bearer-võtme reegel endiselt rakenduks.
Marsruudid /api/v1/ ja /api/v1beta/ all liigitatakse automaatselt tüübiks CLIENT_API. Vahevara jõustab Bearer-kontrolli; marsruuditöötlejad ei pea seda kordama, kuid võivad vajaduse korral subjekti lugeda.
// 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"
// ... töötleja loogika
}Kasutage funktsiooni requireManagementAuth() failist 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;
// ... töötleja loogika
}requireManagementAuth() tagastab õnnestumise korral null või JSON-vormingus veavastuse Response:
- 401
AUTH_001„Autentimine on nõutav“ — identimisteave puudub täielikult - 403 — Bearer on kehtetu või Bearer on olemas, kuid võtmel puudub ulatus
manage/admin
hasManageScope(scopes) tagastab väärtuse true ulatuse "manage" või "admin" korral.
Valige kogum kuju, mitte mugavuse järgi. Üks marsruut lisatakse kogumisse PUBLIC_API_ROUTES_EXACT (või ainult GET-i jaoks kogumisse PUBLIC_READONLY_CORS_API_ROUTES); kogumisse PUBLIC_API_ROUTE_PREFIXES lisatakse üksnes tegelik alampuu ning see peab lõppema märgiga /. Üksiku marsruudi lisamine prefiksiloendisse avalikustab ka kõik külgnevad teed, mille algusmärgid on samad — sealhulgas hiljem lisatud dünaamilise segmendiga sõsarmarsruudid (GHSA-74g9-q8f6-793h). Uuendage ühikteste failides tests/unit/public-api-routes.test.ts, tests/unit/authz/public-route-exact-match.test.ts ja tests/unit/authz/classify.test.ts.
Kolm nimeruumi. Iga kontrollija loeb ainult oma stringe. Kõrvuti võrdlus,
sealhulgas miks manage ebaõnnestub scopeMatches puhul read:compression jaoks ja miks read
ligipääsutoken ei saa PATCH /api/keys/{id}, on
Kolm skoobi nimeruumi.
API võtmed sisaldavad scopes massiivi (salvestatud JSON-ina api_keys.scopes all, vt src/lib/db/apiKeys.ts).
manage/admin—hasManageScope. Kandja ligipääs halduse API marsruutidele.mcp:connect,self:usage,self:account-quotajapolicy:bypass-provider-quotaon aditiivsed täpselt vastavad skoobid. Need asuvad väljaspoolMANAGEMENT_API_KEY_SCOPES.mcp:connectavab ainult/api/mcp/mitte-tagasiside erandi.
Kataloog ja vastavusreeglid (identne string või antud skoop, mis lõpeb *-ga):
MCP tööriista skoobid.
MCP_SCOPE_LIST failis src/shared/constants/mcpScopes.ts on algne tüübitud
alamhulk, mitte see täielik kataloog. Jõustamine toimub
open-sse/mcp-server/scopeEnforcement.ts pärast seda, kui resolveCallerScopeContext()
lahendab skoobid MCP autentimisteabest, päringu metaandmetest või OMNIROUTE_MCP_SCOPES-ist.
See jääb välja lülitatuks, välja arvatud juhul, kui OMNIROUTE_MCP_ENFORCE_SCOPES=true.
read / write / admin oma_live_… tokenitel, järjestatud scopeSatisfies
järgi (src/lib/accessTokens/scopes.ts). See järjestus kehtib ainult
ligipääsutokeni mandaadile. Vt Halduse autentimine.
Funktsioon isAuthRequired() failis src/shared/utils/apiAuth.ts otsustab, kas päringu puhul jõustatakse mingisugune autentimine:
settings.requireLogin === false→ autentimine on globaalselt keelatud.- Parooli pole seadistatud ja keskkonnamuutuja
INITIAL_PASSWORDpuudub → algseadistusrežiim lubab esmase seadistamise viisardi ja loopback-päringud, kuid võrku avatud päringud vajavad endiselt autentimisandmeid. - Mis tahes andmebaasiviga → juurdepääs keelatakse (vaikimisi turvaline).
Kliendi API-võtme nõude jõustamine kasutab funktsiooni isRequireApiKeyEnabled() failis src/shared/utils/featureFlags.ts, mitte process.env.REQUIRE_API_KEY otselugemist. See on juurutatud eksemplaride puhul oluline: sätte REQUIRE_API_KEY muutmine jaotises Dashboard → Feature Flags salvestab andmebaasi alistuse ja mõjutab kohe marsruute /v1/*, /v1beta/*, /models, /responses, /chat/completions, /codex/* ning muid kliendi API autentimiskontrolle, mis kasutavad sama abifunktsiooni. Kui funktsioonilippude hoidlat ei saa lugeda, keelatakse kliendi API autentimise puhul vaikimisi juurdepääs ja nõutakse võtit.
Lõpp-punktid /api/v1/agents/tasks/* ja /api/resilience/model-cooldowns nõuavad nüüd haldusautentimist (commit 588a0333). Kliendid, mis saatsid varem tavalise API-võtme ilma ulatuseta manage, saavad vastuseks 403. Üleviimine: määrake võtmele API Keys juhtpaneelil ulatus manage või kasutage sisselogitud juhtpaneeliseanssi.
/api/mcp/* (MCP kaugserver) on endiselt vaikimisi LOCAL_ONLY, kuid aktsepteerib nüüd mitte-loopback-päringuid, kui päis Authorization: Bearer <api-key> sisaldab ulatust manage. Erand lubatakse iga tee jaoks eraldi konstandi LOCAL_ONLY_MANAGE_SCOPE_BYPASS_PREFIXES kaudu failis src/server/authz/routeGuard.ts; sama taseme LOCAL_ONLY prefiksist /api/cli-tools/runtime/* ei saa tahtlikult mööda minna, sest see võib käivitada suvalisi alamprotsesse. Mitte-loopback-aadressidelt pärit anonüümsed päringud teele /api/mcp/* saavad jätkuvalt vastuseks 403 LOCAL_ONLY — iga uue LOCAL_ONLY tee vaikekäitumiseks jääb range loopback-piirang. Vt Marsruudikaitse tasemed.
- Ühiktestid:
tests/unit/authz/—classify.test.ts,pipeline.test.ts,client-api-policy.test.ts,management-policy.test.ts,public-policy.test.ts. - Avalik lubatud loend:
tests/unit/public-api-routes.test.ts. - Sihttesti käivitamine:
node --import tsx/esm --test tests/unit/authz/classify.test.ts.
Konveier märgistab vastused alati järgmiste päistega:
x-request-id: <korrelatsiooni ID, kajastub veavastustes>
x-omniroute-route-class: PUBLIC | CLIENT_API | MANAGEMENT
Autenditud päringute puhul sisaldavad ülesvoolu (töötleja poolel olevad) päringupäised ka järgmist:
x-omniroute-auth-kind: client_api_key | dashboard_session | management_key | anonymous
x-omniroute-auth-id: key_<viimased 4> | "dashboard" | "anonymous"
x-omniroute-auth-label: (valikuline)
x-omniroute-auth-scopes: komadega eraldatud loend
Kasutage töötlejates funktsiooni assertAuth(req, expectedClass) — kui vahevara jäeti vahele, väljastab see vea AuthzAssertionError koodiga AUTHZ_NOT_INITIALIZED (kasulik konfiguratsiooni regressioonide tuvastamiseks testides).
- API_REFERENCE.md — autentimismärgis iga lõpp-punkti kohta
- COMPLIANCE.md — auditi logi autentimissündmuste jaoks
- MCP-SERVER.md — kolm skoobi nimeruumi ja MCP tööriista-skoobi kataloog
- Allikas:
src/server/authz/,src/lib/api/requireManagementAuth.ts