Skip to main content
OpenID Connect (OIDC) lets your Baseten inference deployments and training jobs authenticate to cloud resources like object storage and container registries using short-lived tokens instead of long-lived credentials. Without OIDC, accessing cloud resources requires long-lived credentials: static API keys or service account keys stored as secrets in Baseten. These keys don’t expire on their own, so if they’re leaked or forgotten, they remain valid until someone manually rotates them. You’re responsible for tracking which keys exist, where they’re used, and when to rotate them. OIDC takes a different approach. Instead of static keys, Baseten issues short-lived tokens scoped to a specific deployment. There are no secrets to store, rotate, or clean up.

How Baseten OIDC works

Baseten acts as an OIDC identity provider with the following configuration:
  • Issuer: https://oidc.baseten.co
  • Audience: oidc.baseten.co
When you deploy your model, Baseten generates short-lived OIDC tokens that identify your specific workload. Your cloud provider validates these tokens against the trust relationship you configure, then grants access to the specified resources.

Token structure

Each OIDC token includes standard JWT claims and custom claims that identify the workload. Baseten provides OIDC tokens for both inference and training workloads. Here are example unsigned payloads for each:
The sub claim uses a structured format that encodes the workload identity:

Claim components

Workload types

  • model_build: Token used during model builds (for example, pulling base images from ECR/GCR or downloading model weights from S3/GCS).
  • model_container: Token used by running model containers (for example, your model code calling cloud services like SQS or DynamoDB at inference time).
  • training_build: Token used to prepare training jobs (for example, pulling a private training image or downloading weights and training data).

Subject claim patterns

Use truss whoami --show-oidc to view your organization and team IDs, issuer, audience, and subject claim format needed for configuring cloud provider trust policies. The patterns below use these identifiers. Common patterns for scoping which workloads can access your resources:
  • AWS: Use these in the IAM role trust policy under Condition.StringLike for oidc.baseten.co:sub. Wildcards (*) are supported.
  • GCP: Use these in the Workload Identity Provider attribute-condition. With the mapping google.subject=assertion.sub (see Create a Workload Identity Provider), reference the sub claim as google.subject. GCP does not support wildcards; use startsWith() (and contains() where needed).

All workloads in a team

To give every workload in your team access to a resource, match on the team ID with a wildcard for everything else.

Specific model, all deployments

To restrict access to a single model while allowing all of its deployments and environments, match on the model ID.

Specific environment, all models

To scope access by environment, match workloads deployed to a specific environment like production.

Build-time only access

To limit access to the build phase, like pulling base images from a private registry or downloading model weights, match on the model_build workload type.

Training jobs only

To grant access to training jobs without granting access to inference workloads, match on the training_build workload type.
To scope access to one training project or job, include its ID in the subject pattern, for example v=1:org=abcd1234:team=wxyz5678:project=project123:job=*:type=training_build.

Runtime only access

To limit access to running containers, like your model code calling cloud services such as SQS or DynamoDB at inference time, match on the model_container workload type.

Specific model and environment

To apply the most restrictive access, combine model and environment matching so only a specific model in a specific environment can authenticate.

Cloud provider setup

When using OIDC for images and weights, Baseten OIDC currently supports:
  • AWS: Amazon ECR (container images) and Amazon S3 (model weights)
  • GCP: Artifact Registry, GCR (container images), and Google Cloud Storage (model weights)
At runtime, the provider list above doesn’t apply. When you enable runtime OIDC, Baseten mounts a short-lived token into your container, and your model code exchanges it with the provider directly. Because your code handles the exchange, any OIDC-supporting provider works, not just AWS and GCP. See the following list of popular OIDC-supporting providers and their documentation on setting up OIDC integration: For AWS and GCP (supported providers for images and weights), you can refer to the guides here:
Run this script to create the OIDC provider, IAM role, and permission policies. Set the variables at the top, then execute the entire script.Prerequisites
  • AWS CLI 2.x.
  • Bash 3.2+.
  • AWS credentials configured for the target account (aws configure, environment variables, or an IAM role) with permission to create OIDC identity providers, IAM roles, and inline role policies (for example iam:CreateOpenIDConnectProvider, iam:CreateRole, iam:PutRolePolicy).
Review each variable before running. Replace the empty values with your actual AWS account ID, S3 bucket name, organization ID, and team ID.
This creates a single role with both ECR and S3 permissions. If you only need ECR or S3 access (not both), comment out or remove the policy section you don’t need (step 4 or step 5).
If you prefer to walk through each step manually, or need to customize individual resources, follow the instructions below.

Create an OIDC identity provider

Register Baseten as a trusted OIDC provider in your AWS account:
  1. Sign in to the AWS IAM Console.
  2. Go to Identity providersAdd provider.
  3. Select OpenID Connect.
  4. Configure the provider:
    • For Provider URL, enter https://oidc.baseten.co.
    • Choose Get thumbprint to verify the provider.
    • For Audience, enter oidc.baseten.co.
  5. Choose Add provider.
If your AWS account requires sts.amazonaws.com as a trusted audience, add it to the OIDC provider first, then add oidc.baseten.co as an additional audience.

Create an IAM role

Create a role that your Baseten workloads can assume through OIDC:
  1. Go to RolesCreate role.
  2. Select Web identity as the trusted entity type.
  3. Choose the OIDC provider you created.
  4. For Audience, select oidc.baseten.co, then choose Next.
  5. On the next page, attach permissions policies for the resources your models need to access:

ECR access (for base images)

Attach this policy to allow pulling container images from ECR.

S3 access (for model weights)

Attach this policy to allow reading model weights from S3.
  1. Configure the trust policy to include subject claim conditions: after creating the role, go to the role → Trust relationshipsEdit and use a policy like this:
Replace <aws-account-id> with your AWS account ID, and adjust the sub claim pattern to match your security requirements.

Use OIDC at build time

Once you’ve completed the AWS or GCP setup above, you can configure OIDC authentication in your Truss. Baseten uses these tokens while it builds and deploys your model, to pull images and download weights:

Use OIDC at runtime

Runtime OIDC is not available for training jobs.
Runtime OIDC makes a short-lived Baseten OIDC token available directly to your running model. Your code can use the token throughout the container lifecycle, including in load() and predict(), to authenticate to OIDC-compatible external systems without storing long-lived credentials. To enable it for a deployment, set the following in your Truss config.yaml:
config.yaml
Runtime OIDC is available for model deployments where Baseten can mount a runtime token into the serving container. This includes custom Truss deployments and custom server deployments configured with base_image and docker_server. Some optimized engine deployments, including BIS-LLM, are not currently supported.
Baseten mounts the token and refreshes it automatically before expiry (such that at least 5 minutes of TTL remains). To access the token, use the B10_OIDC_TOKEN_PATH environment variable. The file contains only the encoded JWT string. To decode and examine the contents, you can use the pyjwt Python package. The following snippet prints the claims of the token during __init__:
config.yaml
model.py
The same provider trust setup described above for AWS and GCP applies here as well, so use those sections to configure identity trust and resource access policies for your runtime integrations. Runtime OIDC tokens always set the type claim to model_container. Otherwise, the claims and token structure are identical to the ones used for images and weights. Token claims reflect the current state of the deployment, including environment even if updated between promotions.
When promoting a deployment between environments, the new OIDC token with the updated environment claim may take up to 30 seconds to appear.

Basic file access

Use this pattern when your model needs to fetch a configured cloud object to support inference. The examples below intentionally keep the flow minimal:
  • Read the bucket and object path from environment variables.
  • Read and print the object’s contents during predict().
  • Rely on the provider SDK to refresh expired credentials automatically using the current OIDC token.
The example code assumes you’ve already completed cloud provider setup.
Review each variable before running. Replace the empty values with your actual AWS values.
config.yaml
model/model.py

More use cases

  • BYOK weight encryption: Keep model weights encrypted in object storage and use runtime OIDC to retrieve the key material needed to decrypt them when the model starts.
  • BYOK payload encryption: Use runtime OIDC to retrieve customer-managed keys, then decrypt requests and encrypt responses during inference.
See the runtime OIDC recipes for more end-to-end examples.

Best practices

Use least-privilege access

Use the most specific subject claim pattern that fits your use case. Create separate roles or Workload Identity providers for different environments, workload types, or models rather than one role with broad permissions. Always test your OIDC configuration in a non-production environment first.
Don’t grant access to v=1:org=*:team=*:*. This allows any Baseten workload to access your resources.

Monitor and audit

  • Enable CloudTrail (AWS) or Cloud Audit Logs (GCP) to track OIDC token usage.
  • Set up alerts for unexpected access patterns.
  • Regularly review which roles are being used.

Troubleshooting

Authentication failures

If your model fails to authenticate:
  1. Verify the trust relationship: Ensure your IAM role trusts the Baseten OIDC provider (https://oidc.baseten.co).
  2. Check the audience: Confirm the audience is set to oidc.baseten.co.
  3. Review subject claim conditions: Verify your sub claim pattern matches the workload identity.
  4. Inspect your identifiers: Run truss whoami --show-oidc to confirm your org and team IDs.

Permission denied errors

If authentication succeeds but operations fail:
  1. Check IAM policies: Ensure the role has the necessary permissions (for example, s3:GetObject, ecr:BatchGetImage).
  2. Verify resource ARNs: Confirm bucket names, registry URLs, and other resource identifiers are correct.
  3. Review resource policies: Some resources (like S3 buckets) have their own policies that may block access.

Common error messages

Debug with CloudWatch/Cloud Logging

Enable detailed logging to see exactly why authentication or authorization is failing: AWS CloudTrail: Look for AssumeRoleWithWebIdentity events to see token validation attempts. GCP Cloud Audit Logs: Check iam.googleapis.com logs for workload identity authentication events.

Migration from long-lived credentials

If you’re currently using long-lived AWS or GCP credentials:
  1. Set up OIDC as described above.
  2. Update your Truss configuration to use OIDC authentication.
  3. Deploy and test your model.
  4. Once confirmed working, remove the long-lived credentials.
  5. Delete any secrets containing long-lived credentials from Baseten.
Both OIDC and long-lived credential authentication methods are supported. You can migrate gradually, starting with non-production environments.

Limitations

  • OIDC tokens can’t be customized.
  • Baseten manages token lifetime and claims.
  • Only AWS and GCP are supported as providers for images and weights. Cloudflare R2, Azure containers, and Hugging Face aren’t yet supported for that use. At runtime, any OIDC-supporting provider works.
  • GCP doesn’t support wildcard subject claims or subject-based scoping in IAM role conditions. Use the Workload Identity Provider attribute-condition instead.
  • GCP limits the mapped google.subject attribute to 127 bytes, which Baseten’s sub claim can exceed with long environment names. Instead of mapping assertion.sub directly, construct a shorter subject from the top-level claims, such as google.subject = "v=1:org=" + assertion.org + ":team=" + assertion.team, and map any additional claims needed for attribute conditions separately.