You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Prove first-login password replacement and mandatory MFA for fresh administrator and normal-user accounts. -- test-dashboard-oidc-pkce-totp-login.sh's pkce-totp-test user already proved mandatory TOTP; a second user (first-login-test, temporary credential) is now driven through Keycloak's own UPDATE_PASSWORD required action thenCONFIGURE_TOTP, matching the real shape of an admin-provisioned account per docs/KEYCLOAK-OPERATIONS.md's provisioning steps -- PR test-dashboard-oidc-pkce-totp-login: prove first-login forced password reset #1096, merged 2026-08-10. Found and fixed two real bugs along the way (wrong kcadm command; Keycloak processes CONFIGURE_TOTP before UPDATE_PASSWORD in this realm, the opposite of an initial unverified guess, and returns the next required-action form inline via HTTP 200 rather than a redirect when it isn't the account's last pending action -- both confirmed via real CI failures, not assumed). CONFIGURE_TOTP is a realm-wide default action (not role-scoped) -- docs/KEYCLOAK-OPERATIONS.md confirms administrators get the identical enforcement as regular users, so this doesn't need a second admin-specific run of the same mechanism.
Exercise native dashboard OIDC login, refresh, account/settings access, role enforcement, logout, disabled/revoked sessions, and fail-closed identity-provider outage behavior. -- Login/refresh/role enforcement/replay-rejection: test-dashboard-oidc-pkce-totp-login.sh. Outage/restart/key-rotation: test-dashboard-oidc-chaos.sh. Disabled/revoked session rejection (and cleanup): dashboard/oidc_auth_test.go (revoked-access-token and revoked-refresh-token cases, both rejected and deleted). Logout is the one sub-item not covered -- split out per operator decision (2026-08-09) as post-0.1.0, non-blocking work, tracked in Gateway logout and outage test assertions (split from #982, post-0.1.0) #1094 (mirrors the same split already made on Phase 6 TESTING: implement automated Keycloak integration, authorization, and protected-service access tests #982).
Verify the admin console requires Keycloak authentication and MFA, while frame/header exceptions remain restricted to the exact compatibility endpoints that need them. -- Frame/header scoping confirmed statically: security-headers-keycloak-frame in vps/traefik/dynamic.yml is applied only via the keycloak-embedded-frames router, whose PathRegexp matches exactly the two Keycloak-internal 3rd-party-cookie-check endpoints (3p-cookies/, login-status-iframe.html) -- not widened generally. MFA enforcement: confirmed by design/config, not a separate test -- docs/KEYCLOAK-OPERATIONS.md has the real admin account created in the apiary realm (not master) with CONFIGURE_TOTP required, and the bootstrap/master-realm no-MFA account is explicitly deleted after that admin is verified (sudo rm .../bootstrap-admin-password, .../admin.initial-password). The realm-wide CONFIGURE_TOTP mechanism this issue's own new test (first-login-test, above) exercises is the same mechanism that applies to that admin account.
Verify no legacy auth runtime, route, middleware, identity header trust, secret, or fallback survives the clean install. -- Audited live on both the homeserver and VPS (2026-08-09): no legacy auth-backend container, Traefik router, or .env reference exists anywhere on either host. Found and fixed two stale comments still describing the old architecture (missed by the earlier Phase 4: switch TANNER, RevDeck, embedded settings, and remaining protected routes to Keycloak #980 cleanup pass), PR dashboard: fix two comments still describing pre-Keycloak auth-backend #1095, merged. docs/TESTING.md's own grep list (AUTH_INTROSPECTION_*, forward-auth, strip-auth-identity, xore_sso, X-Auth-Role) returns zero hits in the working tree; this audit additionally confirmed a deployed fresh install matches.
A truly empty homeserver and VPS can be installed through the documented path and every supported UI is accessible only through the required Keycloak flows, with mandatory MFA and authorization/bypass/outage assertions passing. Static config validation alone is not sufficient.
Finding
Keycloak is now a release requirement, but the canonical 0.1.0 gate does not currently require it:
docs/TESTING.mdTier 3 and 0.1.0 release gate: full clean-reinstall + end-to-end smoke test on homeserver + VPS #787 require a clean reinstall and broad dashboard/ingestion/network/payload checks, but contain no Keycloak acceptance checklist.docs/ROADMAP.mddo not list the Keycloak cutover epic or its testing/validation phases as pre-0.1.0 blockers.Required release-gate changes
docs/TESTING.md's Tier 3 procedure (step 4) has a full "Keycloak (0.1.0 release gate: make Keycloak mandatory in the Tier 3 clean-install E2E #1036, mandatory...)" subsection with exactly this checklist, plus the first-login/MFA, dashboard, per-app, admin-console, and legacy-runtime items below spelled out there too.test-dashboard-oidc-pkce-totp-login.sh'spkce-totp-testuser already proved mandatory TOTP; a second user (first-login-test, temporary credential) is now driven through Keycloak's ownUPDATE_PASSWORDrequired action thenCONFIGURE_TOTP, matching the real shape of an admin-provisioned account perdocs/KEYCLOAK-OPERATIONS.md's provisioning steps -- PR test-dashboard-oidc-pkce-totp-login: prove first-login forced password reset #1096, merged 2026-08-10. Found and fixed two real bugs along the way (wrong kcadm command; Keycloak processes CONFIGURE_TOTP before UPDATE_PASSWORD in this realm, the opposite of an initial unverified guess, and returns the next required-action form inline via HTTP 200 rather than a redirect when it isn't the account's last pending action -- both confirmed via real CI failures, not assumed). CONFIGURE_TOTP is a realm-wide default action (not role-scoped) --docs/KEYCLOAK-OPERATIONS.mdconfirms administrators get the identical enforcement as regular users, so this doesn't need a second admin-specific run of the same mechanism.test-dashboard-oidc-pkce-totp-login.sh. Outage/restart/key-rotation:test-dashboard-oidc-chaos.sh. Disabled/revoked session rejection (and cleanup):dashboard/oidc_auth_test.go(revoked-access-token and revoked-refresh-token cases, both rejected and deleted). Logout is the one sub-item not covered -- split out per operator decision (2026-08-09) as post-0.1.0, non-blocking work, tracked in Gateway logout and outage test assertions (split from #982, post-0.1.0) #1094 (mirrors the same split already made on Phase 6 TESTING: implement automated Keycloak integration, authorization, and protected-service access tests #982).security-headers-keycloak-frameinvps/traefik/dynamic.ymlis applied only via thekeycloak-embedded-framesrouter, whosePathRegexpmatches exactly the two Keycloak-internal 3rd-party-cookie-check endpoints (3p-cookies/,login-status-iframe.html) -- not widened generally. MFA enforcement: confirmed by design/config, not a separate test --docs/KEYCLOAK-OPERATIONS.mdhas the real admin account created in theapiaryrealm (notmaster) withCONFIGURE_TOTPrequired, and the bootstrap/master-realm no-MFA account is explicitly deleted after that admin is verified (sudo rm .../bootstrap-admin-password,.../admin.initial-password). The realm-wide CONFIGURE_TOTP mechanism this issue's own new test (first-login-test, above) exercises is the same mechanism that applies to that admin account..envreference exists anywhere on either host. Found and fixed two stale comments still describing the old architecture (missed by the earlier Phase 4: switch TANNER, RevDeck, embedded settings, and remaining protected routes to Keycloak #980 cleanup pass), PR dashboard: fix two comments still describing pre-Keycloak auth-backend #1095, merged.docs/TESTING.md's own grep list (AUTH_INTROSPECTION_*,forward-auth,strip-auth-identity,xore_sso,X-Auth-Role) returns zero hits in the working tree; this audit additionally confirmed a deployed fresh install matches.docs/TESTING.mdline 134 states explicitly "(0.1.0 release gate: make Keycloak mandatory in the Tier 3 clean-install E2E #1036, mandatory -- makes 0.1.0 release gate: full clean-reinstall + end-to-end smoke test on homeserver + VPS #787 impossible to close until this passes, not an optional extra check)".Pass criterion
A truly empty homeserver and VPS can be installed through the documented path and every supported UI is accessible only through the required Keycloak flows, with mandatory MFA and authorization/bypass/outage assertions passing. Static config validation alone is not sufficient.
Related: #787, #671, #986, #981, #982, #1033, #1034.