Feast Authentication and Authorization Options: OIDC, Kubernetes RBAC, and No-Auth Configuration
Feast supports three built-in authentication modes—no authentication (no_auth), OpenID Connect (OIDC), and Kubernetes RBAC—that integrate with a pluggable authorization manager to enforce role, group, or namespace-based permissions at the API level.
The feast-dev/feast repository implements a flexible authentication framework configured through feature_store.yaml. This system extracts user identity from incoming requests and evaluates it against registry-stored permissions before allowing access to feature data.
Built-in Authentication Modes
Feast provides three distinct authentication strategies, each defined in sdk/python/feast/permissions/auth_model.py and validated through ALLOWED_AUTH_TYPES in sdk/python/feast/repo_config.py.
No Authentication (no_auth)
no_auth disables all token handling and permission checks, accepting every request without validation.
- Configuration: Set
auth: {type: no_auth}infeature_store.yaml - Implementation:
NoAuthConfigclass insdk/python/feast/permissions/auth_model.py - Use case: Local development, CI/CD pipelines, and single-node testing environments
OpenID Connect (OIDC) Authorization
OIDC authentication enables JWT-based security using external identity providers such as Keycloak, Auth0, or Azure AD. Clients obtain access tokens from the provider and transmit them as bearer tokens on each request.
- Server-side configuration:
auth: {type: oidc, auth_discovery_url: "...", client_id: "..."} - Client-side configuration: Supports three credential flows via
OidcClientAuthConfig:- Static token: Directly provide a
tokenfield - Client-credentials flow: Provide
client_secret(machine-to-machine) - Resource Owner Password Grant (ROPG): Provide
username,password, andclient_secret
- Static token: Directly provide a
- Token processing:
OidcTokenParserinsdk/python/feast/permissions/auth/oidc_token_parser.pyvalidates JWT signatures, expiration, and extracts roles from theresource_accessclaim - Client management:
OidcAuthClientManagerhandles token exchange and refresh
Kubernetes RBAC Authorization
Kubernetes authentication leverages service-account tokens automatically mounted in pods. Feast calls the Kubernetes TokenAccessReview API to discover the service-account's groups, namespaces, and bound roles.
- Configuration:
auth: {type: kubernetes, user_token: <optional>}(omituser_tokento use the pod's default service-account token) - Implementation:
KubernetesAuthConfigclass insdk/python/feast/permissions/auth_model.py - Use case: Production deployments inside Kubernetes clusters where you want to reuse existing RBAC policies for intra-cluster services
How the Authorization Pipeline Works
Feast authorizes requests through a multi-stage pipeline implemented in the permissions server utilities:
-
Configuration parsing: When a Feast server starts,
RepoConfigreads theauthblock fromfeature_store.yamland instantiates the appropriate auth configuration class. -
Token extraction: The
AuthManagerdelegates to a TokenExtractor implementation (e.g.,OidcTokenExtractororKubernetesTokenExtractor) to retrieve the bearer token from the HTTP request headers. -
Token parsing:
- For OIDC,
OidcTokenParserverifies the JWT against the discovery URL and extracts role information. - For Kubernetes, the parser executes a TokenAccessReview to retrieve the service-account's group memberships and namespace bindings.
- For OIDC,
-
Permission evaluation: The extracted user attributes feed into the Permission Engine (
feast.permissions.server.utils). This engine compares the requester's roles againstPermissionobjects stored in the registry (documented indocs/reference/registry/registry-permissions.md). -
Enforcement: Every API endpoint in the Feast server checks the current request's permission context before performing create, read, update, or delete operations on feature views, entities, or data sources.
Configuration Examples
Server-Side OIDC Configuration
project: my-project
registry:
path: data/registry.db
online_store:
type: sqlite
auth:
type: oidc
auth_discovery_url: https://keycloak.example.com/realms/feast/.well-known/openid-configuration
client_id: feast-server
The server creates an OidcAuthManager at startup and validates every incoming bearer token against the specified discovery endpoint.
Server-Side Kubernetes RBAC Configuration
project: my-project
registry:
path: data/registry.db
online_store:
type: sqlite
auth:
type: kubernetes
If you omit user_token, Feast automatically extracts the token from /var/run/secrets/kubernetes.io/serviceaccount/token inside the pod.
Client-Side OIDC (Client-Credentials Flow)
project: my-project
registry:
registry_type: remote
path: feast-registry.example.com:80
online_store:
type: remote
path: http://feast-feature-server.example.com:80
auth:
type: oidc
auth_discovery_url: https://keycloak.example.com/realms/feast/.well-known/openid-configuration
client_id: feast-client
client_secret: <secret-value>
from feast import FeatureStore
store = FeatureStore(repo_path=".")
# The client automatically exchanges client_secret for a token
features = store.get_online_features(
feature_refs=["driver:rating"],
entity_rows=[{"driver_id": 1001}]
).to_df()
Client-Side Kubernetes (In-Cluster)
project: my-project
registry:
registry_type: remote
path: feast-registry.default.svc:80
online_store:
type: remote
path: http://feast-feature-server.default.svc:80
auth:
type: kubernetes
from feast import FeatureStore
store = FeatureStore(repo_path=".")
# No explicit credentials; SDK reads the pod's service-account token
features = store.get_online_features(
feature_refs=["driver:rating"],
entity_rows=[{"driver_id": 1001}]
).to_df()
Disabling Authentication
project: quick-start
registry:
path: data/registry.db
online_store:
type: sqlite
auth:
type: no_auth
Summary
- Feast implements a pluggable authorization manager that supports
no_auth, OIDC, and Kubernetes RBAC modes configured viafeature_store.yaml. - OIDC integration in
sdk/python/feast/permissions/auth/oidc_token_parser.pyvalidates external JWTs and extracts role claims for cross-cluster authentication. - Kubernetes RBAC leverages in-cluster service-account tokens and the TokenAccessReview API to enforce namespace and group-based permissions.
- The Permission Engine evaluates every API request against registry-stored permissions after extracting and parsing the authentication token.
- For mixed environments, use OIDC for external clients and Kubernetes auth for intra-cluster services, configuring each component's
authblock independently.
Frequently Asked Questions
What is the default authentication mode in Feast?
If you do not specify an auth block in feature_store.yaml, Feast defaults to no_auth, which disables all permission checks and accepts every request. This is suitable for development but should be explicitly changed to oidc or kubernetes for production deployments.
Can OIDC and Kubernetes authentication be used simultaneously?
Yes. You can configure different Feast components with different auth types depending on their deployment context. For example, configure the feature server with type: oidc to accept external client tokens, while clients running inside the Kubernetes cluster use type: kubernetes to authenticate with their service-account tokens. Each component reads its own feature_store.yaml configuration independently.
How does Feast validate OIDC tokens?
Feast validates OIDC tokens in sdk/python/feast/permissions/auth/oidc_token_parser.py. The parser fetches the JSON Web Key Set (JWKS) from the auth_discovery_url, verifies the JWT signature and expiration, and extracts the resource_access claim to determine the user's roles. These roles are then matched against Feast Permission objects to authorize the requested operation.
Where are permissions defined in Feast?
Permissions are stored in the Feast registry and evaluated by the Permission Engine at runtime. As documented in docs/reference/registry/registry-permissions.md, you define permissions that map roles, groups, or namespaces to specific resources (feature views, data sources, entities) and actions (read, write, delete). The server checks these permissions after authenticating the request but before executing the operation.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →