Skip to main content
Plain (ungated) boxes need none of this: no header is sent and none of this code runs. This page applies to deployments that place an authenticating reverse proxy (a gateway) in front of a box, which rejects unauthenticated traffic with 401 + an X-Gateway-Auth-Url header — the same contract the Lager CLI speaks. The crate handles gated boxes transparently, in two modes.

CLI session reuse (zero config)

If you’ve run lager login <auth_url> on the machine, the crate picks up that session automatically:
  • Reads the CLI’s token store (~/.lager_gateway_auth, overridable via LAGER_GATEWAY_AUTH_FILE).
  • Attaches Authorization: Bearer to every request — including debug-service traffic and UART Socket.IO handshakes.
  • Refreshes expired access tokens transparently.
  • Learns which auth server fronts a box from the gateway’s discovery header on first contact, and retries the denied request within the same call.
No code changes needed — LagerBox::from_env() just works:

Pinned token (CI)

On machines with no CLI login (CI runners), supply a token directly:
or set the LAGER_GATEWAY_TOKEN environment variable — no code change:
A pinned token is attached verbatim to every request and is never refreshed or written to the token store. If the gateway rejects it, the call fails immediately.

Errors

When a gateway asks for auth and no usable credential exists, calls fail with Error::AuthRequired, which names the auth server to log into:

Environment variables

The full client/gateway contract (discovery header, auth server endpoints, store schema, retry semantics) is specified in the monorepo at docs/reference/gateway-auth-contract.md.