stacken.docs

Styrning för en växande portfölj av AI-tjänster

stacken.ai ↗

API · 31 operationer

auth-api

Genererad ur services/auth-api/openapi.json, kontraktsversion 1.0.0. Auth-modell och anropare står i atlasen.

GET /.well-known/jwks.json

Jwks

SvarBeskrivningKropp
200Successful Responseobject application/json

GET /.well-known/openid-configuration

Openid Config

Maskinidentitetsytan — och EN hänvisning vidare (D-71, Task 6). Fälten nedan beskriver `/v1/token/client`: client_credentials, hemlighet i `client_secret_basic`. De är oförändrade sedan tjänsten byggdes, med flit. Auktoriseringsserverns yta (Task 3-5) bor på en ANNAN token-endpoint (SDK:ns `/token`, publika klienter, PKCE), och OIDC-discovery har bara ett `token_endpoint`-fält — att peka om det hade tyst brutit varje integratör som läst det här dokumentet för att nå maskinidentitetsvägen. Alltså: två dokument, ett per yta, och en länk mellan dem i stället för ett dokument som ljuger om någondera. `oauth_authorization_server_metadata` är ingen registrerad OIDC-parameter, men OIDC Discovery 1.0 §3 tillåter ytterligare metadata — samma undantag och samma husform som Task 4:s `resource_indicators_supported` i RFC 8414-dokumentet. Länken sätts BARA när OAuth-ytan faktiskt är rest (`oauth_enabled` är all-or-none). Att peka på ett dokument som svarar 404 vore att byta ut en ofullständig sanning mot en osann.

SvarBeskrivningKropp
200Successful Responseobject application/json

GET /healthz

Healthz

Liveness: process is alive. No deps check.

SvarBeskrivningKropp
200Successful Response{ [nyckel]: string } application/json

GET /readyz

Readyz

Readiness: process can serve traffic. Checks deps.

SvarBeskrivningKropp
200Successful Responseany application/json

GET /v1/admin/tenants/{tenant_id}/channel-identities

List Channel Identities

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseChannelIdentityList application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/tenants/{tenant_id}/channel-identities/{channel}/{team_id}/{external_user_id}

Unmap Channel Identity

Ta bort mappningen. Idempotent; `removed` säger om något fanns. Gäller nästa anrop mot `/v1/token/channel`. Redan utfärdade token lever till sin `exp`, av samma skäl som för återkallad delegering.

ParameterITypKrävs
tenant_idpathstringja
channelpathstringja
team_idpathstringja
external_user_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseChannelIdentityRemoved application/json
422Validation ErrorHTTPValidationError application/json

PUT /v1/admin/tenants/{tenant_id}/channel-identities/{channel}/{team_id}/{external_user_id}

Map Channel Identity

Mappa kanalkontot till personen med den här e-posten. Idempotent. Samma person igen: ingen ändring, ingen auditrad. Annan person: raden skrivs om och auditas med `previous_user_id`, så en ommappning aldrig ser ut som en första mappning i kedjan.

ParameterITypKrävs
tenant_idpathstringja
channelpathstringja
team_idpathstringja
external_user_idpathstringja
authorizationheaderstring | nullnej

Kropp: ChannelIdentityPut application/json

SvarBeskrivningKropp
200Successful ResponseChannelIdentityOut application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tenants/{tenant_id}/export

Export Tenant

ParameterITypKrävs
tenant_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseTenantExport application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/tenants/{tenant_id}/group-mappings

Delete Mapping

ParameterITypKrävs
tenant_idpathstringja
idp_groupquerystringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tenants/{tenant_id}/group-mappings

List Mappings

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseGroupMappingList application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/group-mappings

Create Mapping

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej

Kropp: GroupMappingCreate application/json

SvarBeskrivningKropp
201Successful ResponseGroupMappingOut application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tenants/{tenant_id}/role-bindings

List Bindings

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseRoleBindingList application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/role-bindings

Create Binding

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej

Kropp: RoleBindingCreate application/json

SvarBeskrivningKropp
201Successful ResponseRoleBindingOut application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/tenants/{tenant_id}/role-bindings/{user_id}

Delete Bindings For User

ParameterITypKrävs
tenant_idpathstringja
user_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tenants/{tenant_id}/service-clients

List Service Clients

Tenantens service clients — aldrig `client_secret_hash`, aldrig hemligheten.

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServiceClientList application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/tenants/{tenant_id}/service-clients/{client_id}/channel

Revoke Channel

Ta tillbaka `token:channel`. Gäller nästa anrop mot `/v1/token/channel`.

ParameterITypKrävs
tenant_idpathstringja
client_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServiceClientOut application/json
422Validation ErrorHTTPValidationError application/json

PUT /v1/admin/tenants/{tenant_id}/service-clients/{client_id}/channel

Grant Channel

Slå på `token:channel` (`P3`, D-146). Idempotent, additivt — samma form och samma gränser som delegeringsrätten ovan.

ParameterITypKrävs
tenant_idpathstringja
client_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServiceClientOut application/json
422Validation ErrorHTTPValidationError application/json

DELETE /v1/admin/tenants/{tenant_id}/service-clients/{client_id}/delegation

Revoke Delegation

Ta tillbaka `token:delegate`. Idempotent. Svarar 200 med den uppdaterade raden och inte 204: en administratör som just tagit tillbaka en rättighet ska se att `delegation_allowed` är `false`, inte behöva lita på det. Återkallandet gäller nästa anrop mot `/v1/token/delegate`. Redan utfärdade delegerade token lever till sin `exp` — de är signerade och inte uppslagsbara, och en spärrlista är en egen mekanism med eget felläge.

ParameterITypKrävs
tenant_idpathstringja
client_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServiceClientOut application/json
422Validation ErrorHTTPValidationError application/json

PUT /v1/admin/tenants/{tenant_id}/service-clients/{client_id}/delegation

Grant Delegation

Slå på `token:delegate` för klienten. Idempotent. Additivt: bara scopet i fråga rörs, resten av listan lämnas som den är.

ParameterITypKrävs
tenant_idpathstringja
client_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseServiceClientOut application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/admin/tenants/{tenant_id}/users

List Users

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseUserList application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/users

Invite User

ParameterITypKrävs
tenant_idpathstringja
authorizationheaderstring | nullnej

Kropp: UserInviteRequest application/json

SvarBeskrivningKropp
201Successful ResponseUserOut application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/users/{user_id}/enable

Enable User

ParameterITypKrävs
tenant_idpathstringja
user_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/users/{user_id}/erase

Erase User

ParameterITypKrävs
tenant_idpathstringja
user_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful Responseany application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/users/{user_id}/export

Export User

ParameterITypKrävs
tenant_idpathstringja
user_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful ResponseUserExport application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/admin/tenants/{tenant_id}/users/{user_id}/revoke

Revoke User

ParameterITypKrävs
tenant_idpathstringja
user_idpathstring (uuid)ja
authorizationheaderstring | nullnej
SvarBeskrivningKropp
204Successful Response—
422Validation ErrorHTTPValidationError application/json

GET /v1/me

Me

ParameterITypKrävs
authorizationheaderstring | nullnej
SvarBeskrivningKropp
200Successful Responseobject application/json
422Validation ErrorHTTPValidationError application/json

GET /v1/oauth/callback

Oauth Callback

Andra benet: användaren är tillbaka från kundens IdP.

SvarBeskrivningKropp
200Successful Responseany application/json

POST /v1/token/channel

Token Channel

Kanalkonto → plattforms-JWT för personen bakom det (`P3`, D-146). Ett Slack-user-ID är ingen identitet. Rutten slår upp `(kanal, workspace, kanal-användare)` i `auth.channel_identities` och myntar personens token med kanaladaptern som `act`. **Saknas raden är svaret 403 `channel_identity_unmapped` — det finns ingen andra väg** (#208, OWASP ASI03). `tools/checks/check_no_channel_service_fallback.py` fäller syntaktiskt om uppslaget, det hårda felet eller förbudet mot `mint_service` försvinner ur den här funktionen; täckningsgränsen står i vakten. Tillitsmodellen, utskriven: tokenet myntas på anroparens ord plus vår mappning, inte på en IdP-inloggning. Anroparen är en service-client med `token:channel`, samma tillitsnivå som `token:delegate`; skillnaden är att delegeringen får ett verifierat subjekt-token medan kanalvägen får ett kanal-ID adaptern påstår. Mappningen skrivs bara av tenant-admin. Roller, scopes och grupper kommer ur databasen som efter en inloggning (`RoleResolver`), aldrig ur anropet: adaptern kan inte välja dem. Varje nekande skrivs och committas före `raise`; metadata bär BARA `reason`, aldrig kanal-ID eller e-post — det är angriparvalda strängar. Nekandets `tenant_id` är alltid KLIENTENS (`None` för en plattformsklient), aldrig kroppens: samma invariant som `_deny_delegation` motiverar.

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: TokenChannelRequest application/json

SvarBeskrivningKropp
200Successful ResponseTokenResponse application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/token/client

Token Client

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: TokenClientRequest application/json

SvarBeskrivningKropp
200Successful ResponseTokenResponse application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/token/delegate

Token Delegate

RFC 8693-delegering (P2a, D-101): agenten byter användarens token mot ett där `sub` fortfarande är människan och `act` namnger agenten. Rutten UPPRÄTTHÅLLER ingenting nedströms — den bara utfärdar. Att avvisa anrop utan `act` är P2. Vad den däremot gör är att aldrig utfärda mer än den fick: roller, scopes och grupper kopieras verbatim från subjekt-tokenet och livslängden kapas till dess återstående liv. **Känd gräns — ett subjekt-token med `aud` går inte att delegera.** Verifieraren konstrueras utan `expected_audience`, och `JWTVerifier` är binär i den frågan (D-71): utan deklarerat namn avvisas varje token som BÄR `aud`. Följden är att tokens från OAuth-/RFC 8707-vägen (som sätter `aud` till MCP-resursen) svarar 401 `subject_token_invalid` här, medan tokens från `/v1/token/exchange` (utan `aud`) fungerar. Gränsen är medvetet inte "fixad" genom att skicka en audience till verifieraren — det hade försvagat audience-isoleringen, som är en säkerhetsegenskap, och valet av vilken audience som ska accepteras hör inte hemma i P2a. Låst av `test_subject_token_with_audience_cannot_be_delegated`. Varje nekande skrivs till auditkedjan och COMMITTAS före sitt `raise` (fail-closed) — även de som avvisar själva subjekt-tokenet. Det är just de vägarna en agent som prövar stulna, utgångna, tjänste- eller redan delegerade token går, och en tyst sådan väg lämnar ingen spårbar sondering efter sig. Metadata bär BARA `reason`: aldrig subjekt-tokenet, aldrig dess claims (GDPR first — rutten hanterar legitimationer).

ParameterITypKrävs
authorizationheaderstring | nullnej

Kropp: TokenDelegateRequest application/json

SvarBeskrivningKropp
200Successful ResponseTokenResponse application/json
422Validation ErrorHTTPValidationError application/json

POST /v1/token/exchange

Token Exchange

Kropp: TokenExchangeRequest application/json

SvarBeskrivningKropp
200Successful ResponseTokenResponse application/json
422Validation ErrorHTTPValidationError application/json

Scheman

ChannelIdentityList

FältTypKrävs
itemsChannelIdentityOut[]ja

ChannelIdentityOut

FältTypKrävs
channelstringja
created_atstringja
created_bystringja
external_user_idstringja
team_idstringja
user_idstringja

ChannelIdentityPut

Vem kanalkontot är. E-posten är uppslagsnyckel vid skrivning; det som lagras och ekas är vårt `user_id` (`P3`, D-146).

FältTypKrävs
emailstringja

ChannelIdentityRemoved

FältTypKrävs
removedbooleanja

CoverageGap

En store exporten INTE täcker, med ett ärligt skäl. `store` måste vara IDENTISK med namnet i `covered` när en store demoteras (t.ex. `page_truncated_over_500`), så en konsument kan korrelera flytten. Se regel (c) i docs/tenant-export-coverage.md.

FältTypKrävs
reasonstringja
storestringja

GroupMappingCreate

FältTypKrävs
idp_groupstringja
roles"tenant_admin" | "assistant_editor" | "user" | "viewer"[]ja

GroupMappingList

FältTypKrävs
itemsGroupMappingOut[]ja

GroupMappingOut

FältTypKrävs
created_atstringja
idp_groupstringja
rolesstring[]ja

HTTPValidationError

FältTypKrävs
detailValidationError[]nej

RoleBindingCreate

FältTypKrävs
roles"tenant_admin" | "assistant_editor" | "user" | "viewer"[]ja
user_idstringja

RoleBindingList

FältTypKrävs
itemsRoleBindingOut[]ja

RoleBindingOut

FältTypKrävs
created_atstringja
created_by_user_idstring | nullja
rolesstring[]ja
user_idstringja

ServiceClientList

FältTypKrävs
itemsServiceClientOut[]ja

ServiceClientOut

En service client som en tenant-admin ser den (`P19`). **Aldrig `client_secret_hash`, aldrig `allowed_audiences`, aldrig hela `allowed_scopes`.** Ytan administrerar EN rättighet, så den svarar med EN boolean. Att eka hela scope-listan hade gjort en delegeringsyta till ett fönster mot varje annan rättighet klienten bär — bland dem `tenant:export:read` (`D-60`), som hör till operatörsplanet och inte till tenantens.

FältTypKrävs
channel_allowedbooleanja
client_idstringja
created_atstringja
delegation_allowedbooleanja
last_used_atstring | nullja
namestringja
statusstringja

TenantExport

En producents svar. `extra="forbid"` medvetet: bevarar de tre befintliga typade deklarationernas beteende, OCH gör att en producent som lägger ett fält utan att koordinatorn lär sig om det failar högt i stället för tyst.

FältTypKrävs
coverageTenantExportCoverageja
dataobjectja
generated_atstring (date-time)ja
servicestringja
tenant_idstring (uuid)ja

TenantExportCoverage

FältTypKrävs
coveredstring[]ja
not_coveredCoverageGap[]ja

TokenChannelRequest

Kanalkonto → person (`P3`, D-146). Anroparen är kanaladaptern (service- client med `token:channel`); den PÅSTÅR vem som skrev, och `auth.channel_identities` är det som gör påståendet bevisat.

FältTypKrävs
channelstringja
external_user_idstringja
team_idstringja
tenant_idstring (uuid) | nullnej

TokenClientRequest

FältTypKrävs
audiencestring | nullnej
tenant_idstring | nullnej

TokenDelegateRequest

FältTypKrävs
audiencestring | nullnej
subject_tokenstringja

TokenExchangeRequest

FältTypKrävs
idp_id_tokenstringja
tenant_idstringja

TokenResponse

FältTypKrävs
access_tokenstringja
expires_inintegerja
token_typestringnej

UserExport

FältTypKrävs
audit_eventsobject[]ja
authoring_documentsobjectja
channel_identitiesobject[]nej
conversationsobjectja
coverageUserExportCoverageja
feedbackobject[]ja
generated_atstring (date-time)ja
oauth_codesobject[]nej
oauth_refresh_tokensobject[]nej
policy_decisionsobjectja
profileUserExportProfileja
rolesstring[]ja
tenant_idstring (uuid)ja
usageobjectja
user_idstring (uuid)ja

UserExportCoverage

FältTypKrävs
coveredstring[]ja
not_coveredCoverageGap[]ja

UserExportProfile

FältTypKrävs
created_atstring (date-time)ja
display_namestring | nullja
emailstring | nullja
first_login_atstring (date-time) | nullja
idp_groupsstring[]ja
idp_substring | nullja
last_login_atstring (date-time) | nullja
statusstringja
user_idstring (uuid)ja

UserInviteRequest

FältTypKrävs
display_namestring | nullnej
emailstringja
roles"tenant_admin" | "assistant_editor" | "user" | "viewer"[]nej

UserList

FältTypKrävs
itemsUserOut[]ja

UserOut

FältTypKrävs
created_atstringja
display_namestring | nullja
emailstring | nullja
first_login_atstring | nullja
idstringja
idp_substring | nullja
last_login_atstring | nullja
rolesstring[]ja
statusstringja
tenant_idstringja

ValidationError

FältTypKrävs
ctxobjectnej
inputanynej
locstring | integer[]ja
msgstringja
typestringja