--- name: configuration-authentication description: "Configure authentication portals, backend selection, redirect trust, refresh, and portal wiring. Delegates cookies, UI, transforms, crypto, and OIDC provider details to focused skills." --- # Configuration Authentication ## Purpose Use this skill to configure `authentication portal ` blocks and the route-level `authenticate with ` handler. Use [configuration-http-integrations](../configuration-http-integrations/SKILL.md) to place portal routes, select matchers, wire same-host or split-host portals, separate portal/protected routes, and check directive ordering. Read these files when details matter: - `caddyfile_authn.go` for the portal block. - `caddyfile_authn_token_refresh.go` and [token refresh](references/token-refresh.md) for readable portal refresh configuration, explicit local realms, transports, bounded lifetimes and stores, cookies, placeholders and TLS validation. - `caddyfile_authn_crypto.go` for crypto key directives. - `caddyfile_authn_misc.go` for `enable`, `validate`, and `trust`. - `caddyfile_authn_admin_api.go` and selected upstream `pkg/authn/admin_api/parser` for the independent admin/API key-export switches. - `plugin_authn.go` for route-level `authenticate` syntax. - `../go-authcrunch/config.go` for portal validation, default backend attachment, and user registration wiring. - `../go-authcrunch/pkg/authn/config.go` and `../go-authcrunch/pkg/authn/portal.go` for portal defaults and runtime behavior. Use focused repo-local skills for specialized portal sub-blocks: - Use [configuration-authentication-cross-device](../configuration-authentication-cross-device/SKILL.md) to enable QR/link login, explicit approval, browser binding, cancellation and volatile request lifecycle through the existing portal route. - Use [configuration-oauth-applications](../configuration-oauth-applications/SKILL.md) to configure portal `oidc provider` blocks, named client selection, private registrations, and dedicated provider signing keys. Its [provider reference](../configuration-oauth-applications/references/oidc-provider.md) covers explicit realm participation and separate issuers/cookie scopes across portals; attaching a store for portal login does not enable its realm for OIDC. - Use [configuration-crypto](../configuration-crypto/SKILL.md) to configure portal `crypto` defaults, JWT signing keys, auto-generated keys, token names and lifetimes, secret-backed key material, and System API `system` keys. - Use [configuration-authentication-cookies](../configuration-authentication-cookies/SKILL.md) to configure `cookie` directives and token-cookie naming. - Use [configuration-authentication-ui](../configuration-authentication-ui/SKILL.md) to configure `ui` blocks, templates, static assets, custom CSS/JS/HTML, themes, languages, logos, and private links. - Use [configuration-authentication-user-transforms](../configuration-authentication-user-transforms/SKILL.md) to configure `transform user` blocks, ACL matchers, typed claims, conditional challenge selection, additive legacy requirements, claim replacements, and transform UI links. Persisted local-user challenge rules belong to [configuration-users](../configuration-users/SKILL.md). - Use [configuration-saml-providers](../configuration-saml-providers/SKILL.md) to configure `saml identity provider ` login providers enabled by the portal. - Use [authentication-portal-api](../authentication-portal-api/SKILL.md) to build or troubleshoot JSON login, `/whoami`, `/beacon`, refresh token, and admin/server API interactions. ## Shape ```caddyfile { security { local identity store localdb { realm local path assets/config/users.json } authentication portal myportal { crypto default token lifetime 3600 crypto key sign-verify {env.JWT_SHARED_KEY} enable identity store localdb } } } example.com { @portal path /auth /auth/* route @portal { authenticate with myportal } } ``` The portal name must match the `authenticate with ` reference. Route-level syntax also allows a matcher: `authenticate @matcher with `. Use `myportal` or a descriptive name such as `employee_portal` in examples, fixtures, and tests. Avoid naming a portal `portal`: the repeated words in `authentication portal portal` are confusing. Keep references consistent, for example `authentication portal myportal` and `authenticate with myportal`. ## Portal Wiring Add only the backends the portal should use: ```caddyfile enable identity store localdb enable identity provider github azure enable sso provider aws ``` Define those stores, identity providers, or SSO app providers with the matching domain skills before enabling them. `enable identity provider ` references `oauth identity provider ` or `saml identity provider ` blocks; `enable sso provider ` references `sso provider ` SSO app blocks. Identity stores and identity providers can take multiple names on one line. If a portal has no explicit identity stores and no explicit identity providers, authcrunch currently attaches all configured identity stores and identity providers during `Config.Validate()`. Prefer explicit `enable` lines in new examples. After defaults and disabled-backend filtering, a portal must have at least one identity store or identity provider; SSO providers are additional app providers and do not satisfy the login-backend requirement by themselves. User registration is global authcrunch config. A `user registration ` block names its target identity store; authcrunch validates that store, marks it registration-enabled, and attaches the registry to any portal that has that identity store enabled. Do not generate an `enable user registration ` portal line: the current `enable` parser does not accept it. ## Common Portal Options Use crypto keys for token signing and verification: ```caddyfile crypto default token lifetime 3600 crypto key sign-verify {env.JWT_SHARED_KEY} ``` Use both `enable source ip tracking` and `validate source address` when issued tokens should carry and verify the source address. The first sets authcrunch token grantor source-address tracking; the second makes the token validator enforce the source-address claim. Trusted redirect URI checks support login and logout redirect targets: ```caddyfile trust login redirect uri domain exact example.com path prefix /app trust logout redirect uri domain example.com path / ``` The match type is optional and defaults to `exact`; supported match types are `exact`, `partial`, `prefix`, `suffix`, and `regex`. Both `domain` and `path` need values. Keep `login`/`logout`, `redirect`, and `uri` as separate header tokens. Quoted domain/path values remain data even when they contain those words; they cannot change which redirect trust list receives the rule. Enable admin/server API endpoints only when they are needed and protected by an authenticated admin session: ```caddyfile enable admin api ``` Both `enable` and `disable` are supported for `admin api` and `admin api private key export`. Each setting occurs at most once in the portal; both default to disabled. Key export does not implicitly enable the API and requires both flags plus authenticated admin authorization at runtime. See `authentication-portal-api` for `/api/server/metadata`, `/api/server/realms`, `/api/server/info`, JSON login, `/beacon`, and `/whoami` behavior. Admin API troubleshooting should check the directive, the active portal session, and whether the user has an admin role before changing route layout. Portal access uses built-in role tiers. `authp/admin` grants administrative portal capabilities, `authp/user` grants normal user settings/profile capabilities, and `authp/guest` is the fallback portal-only role when neither admin nor user roles are assigned. When debugging portal UI access, search debug logs for configured portal access-list rules and inspect transforms that add or drop `authp/*` roles. ## Fixtures Use these fixtures as examples: - `testdata/caddyfile_adapt/testcase_security_authentication_portal.Caddyfile` - `testdata/caddyfile_adapt/testcase_authenticate_with_registration.Caddyfile` `TestParseCaddyfileRedirectTrustMalformed` and `TestParseCaddyfileRedirectTrustValues` cover incomplete selectors and quoted values. `testcase_authenticate_with_redirect_trust_malformed` must fail adaptation with a parser error, not a panic. The redirect-trust subtest in `TestCaddyOAuthE2E` verifies separate login/logout behavior over TLS and confirms that rejected reconfiguration leaves the running portal usable. ## Acceptance criteria - A portal with explicitly selected, enabled backends serves login at its exact mount; a disabled or unknown backend is rejected rather than silently replaced. - Trusted redirect rules retain their intended login/logout scope and matcher semantics after adaptation and runtime replacement. - Refresh/OIDC participation is explicit per local realm. A portal-only syntax fixture does not qualify renewal, provider exchanges, or durable restart; those outcomes use the linked feature's Caddy unit and E2E evidence.