@@ -23,9 +23,9 @@ the parent directory:
2323- ` ../helm/files/blueprints ` as the |product-name| blueprint source.
2424- ` ../.generated ` for local generated keys and certificates.
2525
26- The shared tutorial does not build NeMo images for Compose. It runs
27- ` ${IMAGE_REGISTRY:-my-registry}/nmp-api:${BAKE_TAG:-local} ` for both the NeMo
28- API service and workload jobs submitted by the tutorial.
26+ The shared tutorial does not build NeMo Platform images for Compose. It runs
27+ ` ${IMAGE_REGISTRY:-my-registry}/nmp-api:${BAKE_TAG:-local} ` for both the
28+ NeMo Platform API service and workload jobs submitted by the tutorial.
2929
3030## Services
3131
@@ -42,7 +42,7 @@ The stack contains:
4242- ` authentik-redis ` : Redis for Authentik.
4343- ` authentik-server ` and ` authentik-worker ` : Authentik itself.
4444
45- ` nemo ` is only on the internal network. Host and workload traffic reaches NeMo
45+ ` nemo ` is only on the internal network. Host and workload traffic reaches NeMo Platform
4646through the ` gateway ` service, which also joins the workload network as
4747` nemo-gateway ` .
4848
@@ -59,15 +59,15 @@ share local keys:
5959The workload-token private key is mounted into ` nemo ` at
6060` /var/run/secrets/nemo-platform/workload-token-signing/private-key.pem ` .
6161` platform-compose-authentik.yaml ` points
62- ` auth.token_signing.private_key_file ` at that mounted path. The NeMo auth
63- service uses the private key to sign workload-exchange access tokens and Scoped
64- Access Key JWTs, and Envoy validates those tokens through the NeMo auth service
65- JWKS endpoints.
62+ ` auth.token_signing.private_key_file ` at that mounted path. The NeMo Platform
63+ auth service uses the private key to sign workload-exchange access tokens and
64+ Scoped Access Key JWTs, and Envoy validates those tokens through the
65+ NeMo Platform auth service JWKS endpoints.
6666
6767The gateway TLS files are copied into the ` gateway-tls ` named volume by
6868` gateway-tls-init ` . The ` gateway ` service uses that volume to serve HTTPS, and
6969the ` nemo ` service mounts the same volume read-only so Python HTTP clients
70- inside NeMo trust the demo gateway certificate.
70+ inside NeMo Platform trust the demo gateway certificate.
7171
7272All generated keys and certificates in this example are for local development
7373only.
@@ -94,7 +94,7 @@ The `nemo-setup` service account and app-password in the blueprint exist solely
9494for automated auth-idp contract tests. They are not part of the browser login
9595flow or the workload identity pattern.
9696
97- ## NeMo Compose Configuration
97+ ## NeMo Platform Compose Configuration
9898
9999` platform-compose-authentik.yaml ` configures NeMo Platform for this topology:
100100
@@ -104,8 +104,11 @@ flow or the workload identity pattern.
104104 the ` nemo ` container.
105105- Host-side CLI login uses the port-forward-like public gateway URL
106106 ` https://127.0.0.1:18080 ` .
107- - Workload subject tokens come from Authentik's workload OIDC provider.
108- - Exchanged workload access tokens come from NeMo's ` /apis/auth/token ` endpoint.
107+ - Authentik provides user and controller service-principal authentication. The
108+ Docker managed-job OBO binding is stored in NeMo Platform auth delegation
109+ state, not in Authentik.
110+ - Exchanged workload access tokens come from NeMo Platform's ` /apis/auth/token `
111+ endpoint.
109112
110113The Docker jobs executor mounts the ` gateway-tls ` volume into workload
111114containers and sets ` SSL_CERT_FILE ` and ` REQUESTS_CA_BUNDLE ` so workload code
@@ -115,23 +118,23 @@ trusts the local gateway certificate.
115118
116119Envoy is the public entrypoint for the Compose example. It routes:
117120
118- - NeMo paths such as ` /.well-known/nemo-platform/ ` , ` /apis/ ` , ` /health /` ,
119- ` /status ` , and ` /studio/ ` to ` nemo ` .
121+ - NeMo Platform paths such as ` /.well-known/nemo-platform/ ` , ` /apis/ ` ,
122+ ` /health/ ` , ` / status` , and ` /studio/ ` to ` nemo ` .
120123- ` /health/gateway/ready ` to an Envoy-owned readiness check that verifies both
121- NeMo and Authentik through their upstream clusters.
124+ NeMo Platform and Authentik through their upstream clusters.
122125- Authentik paths to ` authentik-server ` .
123126
124127Before authentication, Envoy removes incoming ` X-NMP-Principal-* ` and
125128` X-NMP-Scopes ` headers so a client cannot spoof identity or scopes. For
126- protected ` /apis/ ` requests, Envoy calls NeMo's
129+ protected ` /apis/ ` requests, Envoy calls NeMo Platform 's
127130` /apis/auth/authenticate ` endpoint with the presented bearer token. The auth
128- service validates Authentik OIDC tokens, NeMo workload-exchange access tokens,
129- and NeMo Scoped Access Keys, then returns trusted ` X-NMP-Principal-* ` and
130- ` X-NMP-Scopes ` headers for Envoy to forward upstream.
131+ service validates Authentik OIDC tokens, NeMo Platform workload-exchange access
132+ tokens, and NeMo Platform Scoped Access Keys, then returns trusted
133+ ` X-NMP-Principal-* ` and ` X-NMP- Scopes` headers for Envoy to forward upstream.
131134
132135The gateway callout is required for dynamic or revocable Scoped Access Keys
133136because Envoy JWKS validation can only prove token signature, issuer, audience,
134- and time claims. It cannot check NeMo's access-key lifecycle state. Compose
137+ and time claims. It cannot check NeMo Platform 's access-key lifecycle state. Compose
135138keeps ` auth.access_keys.enabled=true ` so Scoped Access Keys can be created and
136139validated; Envoy performs the bearer-to-header mapping before the request
137140reaches service middleware.
@@ -145,7 +148,7 @@ job request should not include `NMP_WORKLOAD_IDENTITY_TOKEN_FILE`,
145148` NEMO_WORKLOAD_TOKEN ` , or ` NEMO_WORKLOAD_TOKEN_FILE ` .
146149
147150When a managed Docker workload starts, the backend creates a dedicated workload
148- identity volume, writes an Authentik subject token to:
151+ identity volume and writes a NeMo Platform-owned Docker workload proof token to:
149152
150153``` text
151154/var/run/secrets/nemo-platform/workload/token
@@ -158,9 +161,28 @@ NMP_WORKLOAD_IDENTITY_TOKEN_FILE=/var/run/secrets/nemo-platform/workload/token
158161```
159162
160163The SDK reads that file and sends an RFC 8693 token exchange request to the
161- NeMo auth service through the gateway. The NeMo auth service validates the
162- Authentik subject token, mints a NeMo-signed access token, and returns it to the
163- workload. The workload uses that exchanged token for normal NeMo API calls.
164+ NeMo Platform auth service through the gateway. The Docker backend registered
165+ an internal workload delegation row before the container started. The
166+ NeMo Platform auth service validates the proof token, checks the matching row,
167+ mints a NeMo Platform-signed delegated access token, and returns it to the
168+ workload. The access token uses the captured job submitter as the top-level
169+ subject and the Docker workload as the RFC 8693 ` act.sub ` actor.
170+
171+ Docker supports two proof-provider modes:
172+
173+ - ` jwt ` : for embedded standalone deployments where the Docker jobs controller
174+ has an in-process auth-owned JWT issuer. The proof JWT uses
175+ ` token_use="nemo_docker_workload_subject" ` and ` sub=<delegation-row-name> ` .
176+ - ` opaque ` : for split deployments where the jobs controller calls remote auth
177+ state instead of owning signing keys. The file contains a private opaque proof
178+ token type whose secret is stored only as a hash in the delegation row.
179+
180+ The checked-in Compose example uses the default ` auto ` mode, which selects the
181+ opaque provider unless an embedded auth-owned JWT issuer is available. Docker
182+ job OBO therefore does not require Authentik to issue a workload token and does
183+ not depend on an IdP ` jti ` claim. The Authentik workload-provider password
184+ grant in the manifest is retained for direct provider-token contract tests, not
185+ for the managed Docker job exchange loop.
164186
165187The useful end-to-end validation is the workload job in the shared tutorial:
166188the job uses the exchanged token to call the NeMo Platform API and read the
0 commit comments