Implement reverse-proxy forward-auth
Add a /forward-auth endpoint that validates the existing Porchlight session for reverse proxies and returns identity headers for authenticated active users. Unauthenticated or inactive sessions redirect to login, with optional post-login return targets reconstructed from proxy headers and constrained by an allowed host list. Also add forward_auth_allowed_redirect_hosts configuration, preserve validated forward-auth return targets through login/session reset, exempt the endpoint from CSRF for proxy subrequests, document configuration, and cover the flow with tests.
This commit is contained in:
parent
299f6cb7fc
commit
58da15c825
9 changed files with 446 additions and 1 deletions
21
README.md
21
README.md
|
|
@ -96,6 +96,7 @@ variables always take priority over file values.
|
|||
| `OIDC_OP_INVITE_TTL` | `86400` | Magic link expiry in seconds |
|
||||
| `OIDC_OP_MANAGE_CLIENT_ID` | `manage-app` | Client ID for the management UI |
|
||||
| `OIDC_OP_SESSION_HTTPS_ONLY` | `true` | Restrict session cookie to HTTPS (set `false` for local dev) |
|
||||
| `OIDC_OP_FORWARD_AUTH_ALLOWED_REDIRECT_HOSTS` | `[]` | JSON list of hosts allowed as post-login return targets for `/forward-auth` |
|
||||
| `OIDC_OP_CONFIG_FILE` | `porchlight.toml` | Path to TOML config file |
|
||||
|
||||
Database migrations run automatically on startup.
|
||||
|
|
@ -123,6 +124,26 @@ startup. Only `client_secret` and `redirect_uris` are required; the other
|
|||
fields have sensible defaults (`response_types = ["code"]`,
|
||||
`scope = ["openid"]`, `token_endpoint_auth_method = "client_secret_basic"`).
|
||||
|
||||
### Forward-auth for reverse proxies
|
||||
|
||||
Porchlight exposes `/forward-auth` for proxies such as Traefik, Caddy, and
|
||||
nginx `auth_request`. Authenticated active users receive `204 No Content` with
|
||||
identity headers (`Remote-User`, `Remote-Email`, `Remote-Groups`, and
|
||||
`X-Forwarded-*` equivalents). Anonymous users receive a `303` redirect to the
|
||||
Porchlight login page.
|
||||
|
||||
To redirect users back to a protected app after login, allow that app's host:
|
||||
|
||||
```toml
|
||||
forward_auth_allowed_redirect_hosts = ["app.example.com", "*.apps.example.com"]
|
||||
```
|
||||
|
||||
The endpoint uses `X-Forwarded-Proto`, `X-Forwarded-Host`, and
|
||||
`X-Forwarded-Uri` (or `X-Original-Url`) to reconstruct the original request URL.
|
||||
Only exact hosts, `host:port` entries, or explicit `*.example.com` wildcard
|
||||
suffixes listed in `forward_auth_allowed_redirect_hosts` are accepted as return
|
||||
targets.
|
||||
|
||||
To use a config file at a different path:
|
||||
|
||||
```bash
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue