Authorization: Bearer <jwt> on every subsequent API call.
WIF is opt-in. When NexusConfig.wif is None (the default), the SDK falls back to the static api_key flow and behaves exactly as in v0.1.0.
Both NexusClient (sync) and AsyncNexusClient (asyncio) support WIF.
Enabling
api_key becomes optional when WIF is enabled.
Security note (v0.9.0):
base_url must use https:// - NexusClient.create / AsyncNexusClient.create reject plain-http endpoints (loopback/localhost excepted for development), since credentials travel on every request.Supported providers
Whenprovider is "auto" the SDK probes the environment in this order and picks the first provider whose credential material is actually present (v0.9.0 - file stats + live metadata probes, ~1 s timeout; earlier versions keyed on environment variables absent on real cloud nodes):
The OIDC providers are httpx-only;
aws_iam uses botocore (the optional [aws-iam] extra) for the credential/region chain and the SigV4 signer.
You can also pin a specific provider:
AWS IAM (non-EKS AWS compute)
ECS/Fargate tasks, Lambda functions, and plain EC2 instances have IAM credentials but no OIDC token, so the OIDC providers cannot serve them. Theaws_iam provider closes this gap. It requires the optional botocore dependency:
GetCallerIdentity request with the standard AWS credential chain (task role, instance profile, env) - never sending it to AWS - and posts the signed headers + body to /v1/auth/token-exchange as {"provider":"aws_iam","aws_sts_request":...}. Nexus replays it against a pinned STS endpoint and matches the caller’s IAM role against an aws_iam trust policy (subject = arn:aws:iam::<account>:role/<name>).
Nothing else to configure: the SDK signs your service’s own host (the base_url host) into X-Nexus-Server-ID inside the signature, and Nexus verifies it against the host the request arrived on - so a captured signed request is valid for that ONE service only. Selecting aws_iam without botocore installed raises an actionable error naming the extra.
Custom token source
Provide atoken_source callable to bypass auto-detection. The callable may be sync (returns str) or async (returns Awaitable[str]); the async client awaits it automatically.
token_source is set it takes precedence over provider.
Audience
GCP and Azure require anaudience claim when issuing the OIDC token:
"westyx-nexus" if unset.
Azure IMDS is the exception: the generic default is refused with a clear error, because Azure AD rejects it as a resource. On the IMDS path (plain VM / App Service - no federated token file) you MUST set audience to your app registration’s Application ID URI (api://<client-id>). On AKS with Azure Workload Identity the projected federated token file ($AZURE_FEDERATED_TOKEN_FILE) is preferred automatically and no audience is needed.
Token exchange flow
- OIDC token fetch - the configured token source returns a workload-identity JWT.
- Token exchange - the SDK POSTs
{"oidc_token": "<jwt>"}to/v1/auth/token-exchange. The backend validates the OIDC issuer/signature and returns: - Session storage - the SDK caches the session token in memory and uses
Authorization: Bearer <session>on all subsequent/syncand/streamrequests. - Auto-refresh - ~60 s before expiry the SDK silently re-runs steps 1-2 from a background thread (sync) or task (async). The active SSE stream is not interrupted.
auth_expiringevent - when the server emits this control event over SSE, the SDK pre-emptively refreshes the session before the server force-closes the stream.
Split httpx clients
The SDK uses two separatehttpx.Client instances - one for short requests (/sync, /token-exchange, with timeout=cfg.timeout_seconds) and one for the long-lived SSE stream (with timeout=None). This prevents a consumer-supplied short timeout from killing the stream after a few seconds.
