Release v2.11.0
Summary
An application surface served without a session is now reachable through AuthProxy, and a refusal is no longer delivered as a success. Upgrading changes response codes for unauthenticated non-browser callers, and breaks HTTP health probes pointed at / — see the first two entries under Changed before deploying.
Added
AnonymousPathson a service declares path prefixes served to unauthenticated callers, which is what makes a health endpoint or a public page reachable now that the provider-selection page is no longer served to everyone. Prefixes match on whole segments, and an entry that cannot be expressed as plain literal segments is discarded rather than matched, so a declaration can never mean one thing to the middleware and another to the routerWithAnonymousPathsAspire builder for declaring those paths from the app host, so the declaration lives with the service definition instead of in separate configuration- Documentation for anonymous paths, and a page describing how AuthProxy answers unauthenticated callers
Changed
- HTTP liveness and readiness probes pointed at AuthProxy on
/now receive401and must be repointed at a declared anonymous path or switched to a TCP socket probe. A KuberneteshttpGetprobe on/previously got200because the provider-selection page was served to anyone; it now fails, and a failing liveness probe restarts the pod, so this needs changing as part of the upgrade rather than after it - Unauthenticated callers that are not browsers navigating to a page are refused with
401instead of receiving the provider-selection page at200, and tenant selection refuses them with403instead of serving the tenant chooser at200. A page has to carry a success status to render, which meant every non-browser caller was told its request succeeded: a webhook sender recorded delivery and never retried, and a frontend'sfetch()passed the conventionalresponse.okcheck and failed later on parsing, far from the cause - A wildcard
Accept: */*no longer counts as asking for HTML, sofetch(),curland webhook senders receive a status they can act on.*/*is what a client sends when it will take whatever it is given, and reading it as a request for a page is what turned a refusal into a recorded success;Sec-Fetch-Destdecides when present, since it is the only signal separating a document navigation from a scripted request issued by the same browser. A caller sendingtext/html;q=0is likewise taken at its word - The refusal carries a
WWW-Authenticate: Bearerchallenge when a bearer token is accepted, so a caller is told which credential would work rather than having to infer it from a bare401 - Requests are still forwarded unchanged when no identity providers are configured, so a deployment that has not opted into authentication is unaffected by any of the above
Fixed
select-provider.htmlis now shipped. It was documented as a default page but absent from the package, so a multi-provider deployment without a customPagesPathrendered a bare "Error 200" heading where the sign-in chooser should have been- The sign-in chooser returns the user to the page they requested rather than the site root, so a deep link survives signing in