Credential Injection Env Vars
Injects per-service API credentials read from environment variables, so no secret is written into the config
Versions marked “overview” do not contain this page. Selecting one opens that version’s documentation overview.
Category: Setup-dependent integration
Task: Injects per-service API credentials read from environment variables, so no secret is written into the config
Prerequisites: The external service, credentials, or certificates referenced by this configuration.
This configuration comes from the selected release. The example has not been run here; external services are not bundled.
Download the source file.
# Credential Injection from Environment Variables
#
# Injects per-service API credentials read from environment
# variables, so no secret is written into the config. One listener
# fronts several services: a path prefix picks the service, the
# prefix is stripped before forwarding, and the upstream gets that
# service's credential and Host header. Client-provided values for
# the credential header are overwritten.
#
# The variables are read once, when the filter is built, from the
# proxy's own environment. If any of them is unset the proxy refuses
# to start (`praxis -t` reports which one), and rotating a credential
# means restarting the proxy with the new value.
#
# Usage:
# GITHUB_TOKEN=... OPENAI_API_KEY=... INTERNAL_API_KEY=... \
# cargo run -p praxis-proxy -- \
# -c examples/configs/security/credential-injection-env-vars.yaml
#
# Exercise:
# # Upstream sees GET /user with Authorization: Bearer $GITHUB_TOKEN
# # and Host: api.github.com
# curl http://localhost:8080/github/user
#
# # Upstream sees GET /v1/models with Authorization: Bearer
# # $OPENAI_API_KEY and Host: api.openai.com
# curl http://localhost:8080/openai/v1/models
#
# # Upstream sees GET /data with x-api-key: $INTERNAL_API_KEY
# curl http://localhost:8080/internal/data
#
# # Client-provided Authorization is replaced
# curl -H "Authorization: Bearer spoofed" \
# http://localhost:8080/github/user
#
# The endpoints below are local plain-HTTP stand-ins so the example
# runs anywhere. To reach a real API, give the cluster a hostname
# endpoint on 443 and TLS, with SNI matching the Host override
# (`tls.sni` is configured separately from `http.authority`):
#
# - name: github
# endpoints:
# - "api.github.com:443"
# tls:
# sni: "api.github.com"
# http:
# authority: "api.github.com"
listeners:
- name: default
address: "127.0.0.1:8080"
filter_chains:
- main
filter_chains:
- name: main
filters:
- filter: router
routes:
- path_prefix: "/github"
cluster: github
- path_prefix: "/openai"
cluster: openai
- path_prefix: "/internal"
cluster: internal
# The conditions are mutually exclusive, so only one rewrite
# fires per request; allow_rewrite_override tells pipeline
# validation that the extra rewrite filters are intended.
- filter: path_rewrite
strip_prefix: "/github"
conditions:
- when:
path_prefix: "/github"
- filter: path_rewrite
strip_prefix: "/openai"
allow_rewrite_override: true
conditions:
- when:
path_prefix: "/openai"
- filter: path_rewrite
strip_prefix: "/internal"
allow_rewrite_override: true
conditions:
- when:
path_prefix: "/internal"
- filter: credential_injection
clusters:
- name: github
header: Authorization
env_var: GITHUB_TOKEN
header_prefix: "Bearer "
- name: openai
header: Authorization
env_var: OPENAI_API_KEY
header_prefix: "Bearer "
- name: internal
header: x-api-key
env_var: INTERNAL_API_KEY
- filter: load_balancer
clusters:
- name: github
endpoints:
- "127.0.0.1:3001"
http:
authority: "api.github.com"
- name: openai
endpoints:
- "127.0.0.1:3002"
http:
authority: "api.openai.com"
- name: internal
endpoints:
- "127.0.0.1:3003"
http:
authority: "internal.example.com"
insecure_options:
allow_private_endpoints: true # example proxies to local backends