Caddy token based authentication. Supports static tokens from files, signed API keys, JWT tokens, and client certificate authentication.
{
order token first
}
:3000 {
token {
jwt {
issuer https://dex.issuer.lan
group admin
}
}
reverse_proxy https://some.service.internal {
header_up Host {http.reverse_proxy.upstream.hostport}
}
}Read Extending Caddy to get an overview of what interfaces you need to implement.
You first need to build a new caddy executable with this plugin. The easiest way is to do this with xcaddy.
Install xcaddy:
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latestAfter xcaddy installation you can build caddy with this plugin by executing:
xcaddy build v2.8.4 --with github.com/loafoe/caddy-tokenThe token directive supports multiple authentication methods and configuration options.
token {
file <token_file>
jwt {
issuer <issuer_url>
verify <true|false>
group <group_name>
}
signed {
key <signing_key>
scope <scope_name>
}
client_ca {
debug <true|false>
default_org <organization_name>
}
injectOrgHeader <true|false>
allowUpstreamAuth <true|false>
tenantOrgClaim <claim_name>
}Specifies a file containing static API tokens.
Syntax: file <path_to_token_file>
Example:
token {
file /etc/caddy/tokens.txt
}Configures JWT token validation using an OIDC issuer.
Sub-directives:
issuer <url>- OIDC issuer URL for token validationverify <true|false>- Enable/disable token verification (default: true)group <name>- Required group claim (can be specified multiple times)
Example:
token {
jwt {
issuer https://auth.example.com
verify true
group admin
group developers
}
}Configures signed API key validation.
Sub-directives:
key <signing_key>- The signing key for API key validationscope <name>- Required scope (can be specified multiple times)
Example:
token {
signed {
key "your-signing-key-here"
scope read
scope write
}
}Enables client certificate authentication.
Sub-directives:
debug <true|false>- Enable debug logging for client CA operationsdefault_org <organization_name>- Organization name to set in X-Scope-OrgID header (default: "anonymous")
Example:
token {
client_ca {
debug true
default_org "my-organization"
}
}Controls whether to inject the X-Scope-OrgID header based on token claims.
Syntax: injectOrgHeader <true|false>
Default: true
Example:
token {
injectOrgHeader false
}Allows upstream services to set authentication headers.
Syntax: allowUpstreamAuth <true|false>
Default: false
Example:
token {
allowUpstreamAuth true
}Specifies which JWT claim to use for tenant organization mapping.
Syntax: tenantOrgClaim <claim_name>
Options: ort (observability read tenants), owt (observability write tenants)
Example:
token {
tenantOrgClaim ort
}{
order token first
}
:8080 {
token {
file /etc/caddy/api-tokens.txt
injectOrgHeader true
}
respond "Authenticated with static token"
}{
order token first
}
:8080 {
token {
jwt {
issuer https://auth.example.com
verify true
group admin
}
tenantOrgClaim ort
injectOrgHeader true
}
reverse_proxy backend:3000
}{
order token first
}
:8080 {
token {
signed {
key "your-secret-signing-key"
scope api:read
scope api:write
}
}
reverse_proxy api-server:8000
}{
order token first
}
:8080 {
token {
client_ca {
debug true
default_org "secure-clients"
}
allowUpstreamAuth false
}
reverse_proxy secure-service:9000
}{
order token first
}
:8080 {
token {
file /etc/caddy/tokens.txt
jwt {
issuer https://sso.company.com
group employees
}
signed {
key "api-signing-key"
scope service:access
}
client_ca {
debug false
default_org "combined-clients"
}
injectOrgHeader true
allowUpstreamAuth false
tenantOrgClaim ort
}
reverse_proxy internal-service:5000
}The plugin checks for authentication in the following order:
-
Upstream Authentication - When
allowUpstreamAuthis enabled, allows upstreamX-Scope-OrgIDheaders -
Client Certificate Authentication - When
client_cais configured, checks for TLS client certificates and setsX-Scope-OrgIDto the configureddefault_orgvalue -
API Key Authentication - Checks for API keys in:
X-Api-Keyheader- Basic Auth password field
Authorization: Bearer <token>header
-
JWT Token Authentication - Validates JWT tokens from:
X-Id-Tokenheader- Verifies against configured OIDC issuer
License is Apache 2.0