gitextract_j1wzyoop/ ├── .github/ │ └── workflows/ │ ├── build.yml │ └── e2e-tests.yml ├── .gitignore ├── .run/ │ ├── Acme Backend API Quarkus.run.xml │ ├── Keycloak Remote.run.xml │ ├── OfflineSessionClient (logout).run.xml │ ├── OfflineSessionClient.run.xml │ ├── acme-webapp-saml-node-express.run.xml │ ├── backend-api-micronaut.run.xml │ ├── backend-api-springboot-reactive.run.xml │ ├── backend-api-springboot.run.xml │ ├── backend-api-springboot3.run.xml │ ├── frontend-webapp-springboot-otel.run.xml │ ├── frontend-webapp-springboot.run.xml │ └── frontend-webapp-springboot3.run.xml ├── .vscode/ │ └── settings.json ├── LICENSE ├── apps/ │ ├── account-svc/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ ├── .gitignore │ │ │ ├── MavenWrapperDownloader.java │ │ │ └── maven-wrapper.properties │ │ ├── README.md │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── docker/ │ │ │ ├── Dockerfile.jvm │ │ │ ├── Dockerfile.legacy-jar │ │ │ ├── Dockerfile.native │ │ │ └── Dockerfile.native-micro │ │ ├── java/ │ │ │ └── com/ │ │ │ └── thomasdarimont/ │ │ │ └── keycloak/ │ │ │ └── training/ │ │ │ └── accounts/ │ │ │ ├── User.java │ │ │ ├── UserRepository.java │ │ │ └── UserResource.java │ │ └── resources/ │ │ └── application.properties │ ├── acme-account-console/ │ │ └── index.html │ ├── acme-greetme/ │ │ └── index.html │ ├── acme-webapp-saml-node-express/ │ │ ├── package.json │ │ ├── src/ │ │ │ ├── config.js │ │ │ ├── express.js │ │ │ ├── index.js │ │ │ ├── logging.js │ │ │ └── server.js │ │ └── views/ │ │ ├── pages/ │ │ │ ├── app.ejs │ │ │ ├── error.ejs │ │ │ ├── index.ejs │ │ │ └── page1.ejs │ │ └── partials/ │ │ ├── footer.ejs │ │ ├── head.ejs │ │ └── header.ejs │ ├── backend-api-dnc/ │ │ ├── api/ │ │ │ ├── .dockerignore │ │ │ ├── .gitignore │ │ │ ├── Controllers/ │ │ │ │ └── UsersController.cs │ │ │ ├── Dockerfile │ │ │ ├── JwtBearerOptions.cs │ │ │ ├── Program.cs │ │ │ ├── Properties/ │ │ │ │ └── launchSettings.json │ │ │ ├── api.csproj │ │ │ ├── appsettings.Development.json │ │ │ └── appsettings.json │ │ └── backend-api-dnc.sln │ ├── backend-api-micronaut/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ ├── MavenWrapperDownloader.java │ │ │ └── maven-wrapper.properties │ │ ├── README.md │ │ ├── micronaut-cli.yml │ │ ├── mvnw │ │ ├── mvnw.bat │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── acme/ │ │ │ └── backend/ │ │ │ └── micronaut/ │ │ │ ├── Application.java │ │ │ └── api/ │ │ │ └── UsersResource.java │ │ └── resources/ │ │ ├── application.yml │ │ └── logback.xml │ ├── backend-api-node-express/ │ │ ├── package.json │ │ ├── readme.md │ │ └── src/ │ │ ├── api.js │ │ ├── config.js │ │ ├── express.js │ │ ├── index.js │ │ ├── logging.js │ │ └── server.js │ ├── backend-api-quarkus/ │ │ ├── .dockerignore │ │ ├── .gitignore │ │ ├── README.md │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── docker/ │ │ │ ├── Dockerfile.jvm │ │ │ ├── Dockerfile.legacy-jar │ │ │ ├── Dockerfile.native │ │ │ └── Dockerfile.native-distroless │ │ ├── java/ │ │ │ └── com/ │ │ │ └── acme/ │ │ │ └── backend/ │ │ │ └── quarkus/ │ │ │ └── users/ │ │ │ └── UsersResource.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ └── resources/ │ │ │ └── index.html │ │ └── application.properties │ ├── backend-api-rust-actix/ │ │ ├── .gitignore │ │ ├── Cargo.toml │ │ ├── rustfmt.toml │ │ ├── rustup-toolchain.toml │ │ └── src/ │ │ ├── api/ │ │ │ ├── me_info.rs │ │ │ └── mod.rs │ │ ├── config.rs │ │ ├── main.rs │ │ └── middleware/ │ │ ├── cors.rs │ │ ├── jwt_auth.rs │ │ ├── mod.rs │ │ └── ssl.rs │ ├── backend-api-rust-rocket/ │ │ ├── .gitignore │ │ ├── .run/ │ │ │ └── Run backend-api-rust-rocket.run.xml │ │ ├── Cargo.toml │ │ ├── README.md │ │ ├── Rocket.toml │ │ ├── rustfmt.toml │ │ ├── rustup-toolchain.toml │ │ ├── src/ │ │ │ ├── domain/ │ │ │ │ ├── mod.rs │ │ │ │ └── user.rs │ │ │ ├── main.rs │ │ │ ├── middleware/ │ │ │ │ ├── auth/ │ │ │ │ │ ├── jwt/ │ │ │ │ │ │ ├── auth.rs │ │ │ │ │ │ ├── claims.rs │ │ │ │ │ │ ├── config.rs │ │ │ │ │ │ ├── get_max_age.rs │ │ │ │ │ │ ├── jwks.rs │ │ │ │ │ │ ├── mod.rs │ │ │ │ │ │ └── verifier.rs │ │ │ │ │ ├── jwt_auth_request_guard.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── cors/ │ │ │ │ │ ├── cors.rs │ │ │ │ │ └── mod.rs │ │ │ │ ├── logging/ │ │ │ │ │ ├── logging.rs │ │ │ │ │ └── mod.rs │ │ │ │ └── mod.rs │ │ │ └── support/ │ │ │ ├── mod.rs │ │ │ └── scheduling/ │ │ │ ├── mod.rs │ │ │ └── use_repeating_job.rs │ │ └── tests/ │ │ └── fetch_keys.rs │ ├── backend-api-springboot/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ ├── MavenWrapperDownloader.java │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── acme/ │ │ │ │ └── backend/ │ │ │ │ └── springboot/ │ │ │ │ └── users/ │ │ │ │ ├── BackendApiSpringbootApp.java │ │ │ │ ├── config/ │ │ │ │ │ ├── AcmeServiceProperties.java │ │ │ │ │ ├── JwtSecurityConfig.java │ │ │ │ │ ├── MethodSecurityConfig.java │ │ │ │ │ └── WebSecurityConfig.java │ │ │ │ ├── support/ │ │ │ │ │ ├── access/ │ │ │ │ │ │ └── AccessController.java │ │ │ │ │ ├── keycloak/ │ │ │ │ │ │ ├── KeycloakAudienceValidator.java │ │ │ │ │ │ ├── KeycloakGrantedAuthoritiesConverter.java │ │ │ │ │ │ └── KeycloakJwtAuthenticationConverter.java │ │ │ │ │ └── permissions/ │ │ │ │ │ ├── DefaultPermissionEvaluator.java │ │ │ │ │ └── DomainObjectReference.java │ │ │ │ └── web/ │ │ │ │ └── UsersController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── acme/ │ │ └── backend/ │ │ └── springboot/ │ │ └── users/ │ │ └── BackendApiSpringbootAppTests.java │ ├── backend-api-springboot-reactive/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── acme/ │ │ │ │ └── backend/ │ │ │ │ └── springreactive/ │ │ │ │ ├── BackendApiSpringbootReactiveApp.java │ │ │ │ ├── config/ │ │ │ │ │ ├── AcmeServiceProperties.java │ │ │ │ │ ├── JwtSecurityConfig.java │ │ │ │ │ ├── MethodSecurityConfig.java │ │ │ │ │ ├── WebFluxConfig.java │ │ │ │ │ ├── WebFluxRoutes.java │ │ │ │ │ └── WebSecurityConfig.java │ │ │ │ ├── support/ │ │ │ │ │ └── keycloak/ │ │ │ │ │ ├── KeycloakAudienceValidator.java │ │ │ │ │ ├── KeycloakGrantedAuthoritiesConverter.java │ │ │ │ │ └── KeycloakJwtAuthenticationConverter.java │ │ │ │ └── users/ │ │ │ │ └── UserHandlers.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── acme/ │ │ └── backend/ │ │ └── springreactive/ │ │ └── BackendApiSpringbootReactiveAppTests.java │ ├── backend-api-springboot3/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ ├── MavenWrapperDownloader.java │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── acme/ │ │ │ │ └── backend/ │ │ │ │ └── springboot/ │ │ │ │ └── users/ │ │ │ │ ├── BackendApiSpringboot3App.java │ │ │ │ ├── config/ │ │ │ │ │ ├── AcmeServiceProperties.java │ │ │ │ │ ├── JwtSecurityConfig.java │ │ │ │ │ ├── MethodSecurityConfig.java │ │ │ │ │ └── WebSecurityConfig.java │ │ │ │ ├── support/ │ │ │ │ │ ├── access/ │ │ │ │ │ │ └── AccessController.java │ │ │ │ │ ├── keycloak/ │ │ │ │ │ │ ├── KeycloakAudienceValidator.java │ │ │ │ │ │ ├── KeycloakGrantedAuthoritiesConverter.java │ │ │ │ │ │ └── KeycloakJwtAuthenticationConverter.java │ │ │ │ │ └── permissions/ │ │ │ │ │ ├── DefaultPermissionEvaluator.java │ │ │ │ │ └── DomainObjectReference.java │ │ │ │ └── web/ │ │ │ │ └── UsersController.java │ │ │ └── resources/ │ │ │ └── application.yml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── acme/ │ │ └── backend/ │ │ └── springboot/ │ │ └── users/ │ │ └── BackendApiSpringboot3AppTests.java │ ├── bff-springboot/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── github/ │ │ │ └── thomasdarimont/ │ │ │ └── apps/ │ │ │ └── bff/ │ │ │ ├── BffApp.java │ │ │ ├── api/ │ │ │ │ └── UsersResource.java │ │ │ ├── config/ │ │ │ │ ├── OAuth2RestTemplateConfig.java │ │ │ │ ├── SessionConfig.java │ │ │ │ ├── WebSecurityConfig.java │ │ │ │ └── keycloak/ │ │ │ │ └── KeycloakLogoutHandler.java │ │ │ ├── oauth/ │ │ │ │ ├── TokenAccessor.java │ │ │ │ ├── TokenIntrospector.java │ │ │ │ └── TokenRefresher.java │ │ │ └── web/ │ │ │ └── UiResource.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── static/ │ │ │ └── app/ │ │ │ └── app.js │ │ └── templates/ │ │ └── app/ │ │ └── index.html │ ├── bff-springboot3/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── github/ │ │ │ └── thomasdarimont/ │ │ │ └── apps/ │ │ │ └── bff3/ │ │ │ ├── Bff3App.java │ │ │ ├── api/ │ │ │ │ └── UsersResource.java │ │ │ ├── config/ │ │ │ │ ├── OAuth2RestTemplateConfig.java │ │ │ │ ├── SessionConfig.java │ │ │ │ ├── WebSecurityConfig.java │ │ │ │ └── keycloak/ │ │ │ │ └── KeycloakLogoutHandler.java │ │ │ ├── oauth/ │ │ │ │ ├── TokenAccessor.java │ │ │ │ ├── TokenIntrospector.java │ │ │ │ └── TokenRefresher.java │ │ │ ├── support/ │ │ │ │ ├── HttpServletRequestUtils.java │ │ │ │ └── HttpSessionOAuth2AuthorizedClientService.java │ │ │ └── web/ │ │ │ ├── AuthResource.java │ │ │ └── UiResource.java │ │ └── resources/ │ │ ├── application.yml │ │ ├── static/ │ │ │ └── app/ │ │ │ └── app.js │ │ └── templates/ │ │ └── app/ │ │ └── index.html │ ├── frontend-webapp-springboot/ │ │ ├── .gitignore │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── github/ │ │ │ │ └── thomasdarimont/ │ │ │ │ └── keycloak/ │ │ │ │ └── webapp/ │ │ │ │ ├── WebAppSpringBoot.java │ │ │ │ ├── config/ │ │ │ │ │ ├── KeycloakWebClientConfig.java │ │ │ │ │ ├── OidcUserServiceConfig.java │ │ │ │ │ └── WebSecurityConfig.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── ApplicationEntry.java │ │ │ │ │ ├── CredentialEntry.java │ │ │ │ │ ├── SettingEntry.java │ │ │ │ │ └── UserProfile.java │ │ │ │ ├── support/ │ │ │ │ │ ├── OAuth2AuthorizedClientAccessor.java │ │ │ │ │ ├── TokenAccessor.java │ │ │ │ │ ├── TokenIntrospector.java │ │ │ │ │ ├── keycloakclient/ │ │ │ │ │ │ ├── DefaultKeycloakClient.java │ │ │ │ │ │ ├── KeycloakClient.java │ │ │ │ │ │ ├── KeycloakIntrospectResponse.java │ │ │ │ │ │ ├── KeycloakServiceException.java │ │ │ │ │ │ └── KeycloakUserInfo.java │ │ │ │ │ └── security/ │ │ │ │ │ └── KeycloakLogoutHandler.java │ │ │ │ └── web/ │ │ │ │ ├── AuthController.java │ │ │ │ └── UiController.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── templates/ │ │ │ ├── applications.html │ │ │ ├── fragments.html │ │ │ ├── index.html │ │ │ ├── profile.html │ │ │ ├── security.html │ │ │ └── settings.html │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── github/ │ │ └── thomasdarimont/ │ │ └── keycloak/ │ │ └── cac/ │ │ └── WebApplicationTestsSpringBoot.java │ ├── frontend-webapp-springboot3/ │ │ ├── otel-config.yaml │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── github/ │ │ │ │ └── thomasdarimont/ │ │ │ │ └── keycloak/ │ │ │ │ └── webapp/ │ │ │ │ ├── WebAppSpringBoot3.java │ │ │ │ ├── config/ │ │ │ │ │ ├── KeycloakWebClientConfig.java │ │ │ │ │ ├── OidcUserServiceConfig.java │ │ │ │ │ └── WebSecurityConfig.java │ │ │ │ ├── domain/ │ │ │ │ │ ├── ApplicationEntry.java │ │ │ │ │ ├── CredentialEntry.java │ │ │ │ │ ├── SettingEntry.java │ │ │ │ │ └── UserProfile.java │ │ │ │ ├── support/ │ │ │ │ │ ├── HttpServletRequestUtils.java │ │ │ │ │ ├── HttpSessionOAuth2AuthorizedClientService.java │ │ │ │ │ ├── TokenAccessor.java │ │ │ │ │ ├── TokenIntrospector.java │ │ │ │ │ ├── keycloakclient/ │ │ │ │ │ │ ├── DefaultKeycloakClient.java │ │ │ │ │ │ ├── KeycloakClient.java │ │ │ │ │ │ ├── KeycloakIntrospectResponse.java │ │ │ │ │ │ ├── KeycloakServiceException.java │ │ │ │ │ │ └── KeycloakUserInfo.java │ │ │ │ │ └── security/ │ │ │ │ │ └── KeycloakLogoutHandler.java │ │ │ │ └── web/ │ │ │ │ ├── AuthController.java │ │ │ │ └── UiController.java │ │ │ └── resources/ │ │ │ ├── application.yml │ │ │ └── templates/ │ │ │ ├── applications.html │ │ │ ├── fragments.html │ │ │ ├── index.html │ │ │ ├── profile.html │ │ │ ├── security.html │ │ │ └── settings.html │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── github/ │ │ └── thomasdarimont/ │ │ └── keycloak/ │ │ └── cac/ │ │ └── WebApplicationTestsSpringBoot.java │ ├── java-opa-embedded/ │ │ ├── .gitignore │ │ ├── jd-gui.cfg │ │ ├── pom.xml │ │ ├── readme.md │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── demo/ │ │ │ └── OpaEmbeddedDemo.java │ │ └── resources/ │ │ ├── data/ │ │ │ └── user_roles.json │ │ └── policy/ │ │ ├── app/ │ │ │ └── rbac/ │ │ │ └── policy.rego │ │ └── policy.wasm │ ├── jwt-client-authentication/ │ │ ├── .gitignore │ │ ├── .mvn/ │ │ │ └── wrapper/ │ │ │ └── maven-wrapper.properties │ │ ├── mvnw │ │ ├── mvnw.cmd │ │ ├── pom.xml │ │ ├── readme.md │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── demo/ │ │ │ └── jwtclientauth/ │ │ │ └── JwtClientAuthApp.java │ │ └── resources/ │ │ └── application.properties │ ├── keycloak-js/ │ │ ├── package.json │ │ └── readme.md │ ├── oauth2-proxy/ │ │ ├── Dockerfile │ │ ├── app/ │ │ │ └── main.go │ │ ├── docker-compose.yml │ │ ├── oauth2-proxy.cfg │ │ └── readme.md │ ├── offline-session-client/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── demo/ │ │ └── OfflineSessionClient.java │ ├── site/ │ │ ├── accountdeleted.html │ │ ├── imprint.html │ │ ├── lib/ │ │ │ └── keycloak-js/ │ │ │ ├── keycloak-authz.js │ │ │ └── keycloak.js │ │ ├── privacy.html │ │ ├── site.html │ │ └── terms.html │ └── spring-boot-device-flow-client/ │ ├── .gitignore │ ├── .mvn/ │ │ └── wrapper/ │ │ └── maven-wrapper.properties │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── demo/ │ │ └── SpringBootDeviceFlowApplication.java │ └── resources/ │ └── application.properties ├── bin/ │ ├── applyRealmConfig.java │ ├── createTlsCerts.java │ ├── envcheck.java │ ├── importCertificateIntoTruststore.java │ ├── installOtel.java │ ├── keycloakConfigCli.default.env │ ├── keycloakConfigCli.java │ └── realmImex.java ├── config/ │ └── stage/ │ └── dev/ │ ├── grafana/ │ │ └── provisioning/ │ │ ├── dashboards/ │ │ │ ├── dashboard.yml │ │ │ ├── keycloak-capacity-planning-dashboard.json │ │ │ ├── keycloak-metrics_rev1.json │ │ │ └── keycloak-troubleshooting-dashboard.json │ │ └── datasources/ │ │ └── datasources.yml │ ├── opa/ │ │ ├── iam/ │ │ │ ├── authzen/ │ │ │ │ └── interop/ │ │ │ │ ├── access/ │ │ │ │ │ ├── policy.rego │ │ │ │ │ └── v1/ │ │ │ │ │ └── search/ │ │ │ │ │ └── policy.rego │ │ │ │ └── data.json │ │ │ └── keycloak/ │ │ │ └── policy.rego │ │ ├── inputs/ │ │ │ └── input.json │ │ ├── opa.md │ │ ├── policies/ │ │ │ └── keycloak/ │ │ │ ├── realms/ │ │ │ │ ├── opademo/ │ │ │ │ │ └── access/ │ │ │ │ │ ├── policy.rego │ │ │ │ │ └── policy_test.rego │ │ │ │ └── opademo2/ │ │ │ │ └── access/ │ │ │ │ └── policy.rego │ │ │ └── utils/ │ │ │ └── kc/ │ │ │ └── helpers.rego │ │ └── watch-opa.sh │ ├── openldap/ │ │ └── demo.ldif │ ├── otel/ │ │ ├── otel-collector-config-tls.yaml │ │ └── otel-collector-config.yaml │ ├── prometheus/ │ │ └── prometheus.yml │ ├── realms/ │ │ ├── acme-api.yaml │ │ ├── acme-apps.yaml │ │ ├── acme-auth0.yaml │ │ ├── acme-client-examples.yaml │ │ ├── acme-demo.yaml │ │ ├── acme-internal.yaml │ │ ├── acme-ldap.yaml │ │ ├── acme-offline-test.yaml │ │ ├── acme-ops.yaml │ │ ├── acme-passwordless.yaml │ │ ├── acme-saml.yaml │ │ ├── acme-stepup.yaml │ │ ├── company-apps.yaml │ │ ├── company-users.yaml │ │ ├── master.yaml │ │ ├── other/ │ │ │ ├── acme-internal-custom.yaml │ │ │ ├── acme-saml.yaml │ │ │ ├── acme-user-profile.yaml │ │ │ ├── acme-vci.yaml │ │ │ ├── acme-workshop-clients.yaml │ │ │ ├── acme-workshop-idp.yaml │ │ │ └── acme-workshop.yaml │ │ └── workshop.yaml │ └── tls/ │ └── .gitkeep ├── deployments/ │ └── local/ │ ├── cluster/ │ │ ├── apache/ │ │ │ ├── docker-compose-apache.yml │ │ │ └── id.acme.test.conf │ │ ├── caddy/ │ │ │ ├── caddy.json │ │ │ └── docker-compose-caddy.yml │ │ ├── cli/ │ │ │ ├── 0001-onstart-init.cli │ │ │ ├── 0010-add-jmx-user.sh │ │ │ ├── 0100-onstart-setup-remote-caches.cli │ │ │ ├── 0200-onstart-setup-jgroups-encryption.cli │ │ │ └── 0300-onstart-setup-ispn-jdbc-store.cli │ │ ├── docker-compose.yml │ │ ├── haproxy/ │ │ │ ├── Dockerfile │ │ │ ├── docker-compose-haproxy.yml │ │ │ └── haproxy.cfg │ │ ├── haproxy-database-ispn/ │ │ │ ├── cli/ │ │ │ │ ├── 0010-add-jmx-user.sh │ │ │ │ └── 0300-onstart-setup-ispn-jdbc-store.cli │ │ │ └── docker-compose-haproxy-jdbc-store.yml │ │ ├── haproxy-encrypted-ispn/ │ │ │ ├── cli/ │ │ │ │ └── 0200-onstart-setup-jgroups-encryption.cli │ │ │ ├── docker-compose-enc-haproxy.yml │ │ │ ├── ispn/ │ │ │ │ └── jgroups.p12 │ │ │ └── jgroups-keystore.sh │ │ ├── haproxy-external-ispn/ │ │ │ ├── cli/ │ │ │ │ ├── 0100-onstart-setup-hotrod-caches.cli │ │ │ │ └── 0100-onstart-setup-remote-caches.cli │ │ │ ├── docker-compose-haproxy-ispn-hotrod.yml │ │ │ ├── docker-compose-haproxy-ispn-remote.yml │ │ │ ├── haproxy-external-ispn.env │ │ │ ├── ispn/ │ │ │ │ ├── Dockerfile │ │ │ │ ├── cacerts │ │ │ │ ├── conf/ │ │ │ │ │ ├── infinispan-keycloak.xml │ │ │ │ │ └── users.properties │ │ │ │ ├── ispn-server.jks │ │ │ │ └── ispn-truststore.jks │ │ │ └── readme.md │ │ ├── nginx/ │ │ │ ├── docker-compose-nginx.yml │ │ │ └── nginx.conf │ │ └── readme.md │ ├── clusterx/ │ │ ├── docker-compose.yml │ │ ├── haproxy/ │ │ │ ├── Dockerfile │ │ │ ├── acme.test+1.p12 │ │ │ ├── docker-compose-haproxy.yml │ │ │ └── haproxy.cfg │ │ ├── haproxy-database-ispn/ │ │ │ ├── Dockerfile │ │ │ ├── acme.test+1.p12 │ │ │ ├── cache-ispn-database.xml │ │ │ ├── docker-compose.yml │ │ │ ├── haproxy.cfg │ │ │ └── readme.md │ │ ├── haproxy-external-ispn/ │ │ │ ├── cache-ispn-remote.xml │ │ │ ├── docker-compose-haproxy-ispn-remote.yml │ │ │ ├── haproxy-external-ispn.env │ │ │ ├── haproxy.cfg │ │ │ └── ispn/ │ │ │ ├── Dockerfile │ │ │ ├── cacerts │ │ │ ├── conf/ │ │ │ │ ├── infinispan-keycloak.xml │ │ │ │ └── users.properties │ │ │ ├── ispn-server.jks │ │ │ └── ispn-truststore.jks │ │ ├── haproxy-external-ispn-database/ │ │ │ ├── cache-ispn-remote.xml │ │ │ ├── docker-compose-haproxy-ispn-remote-database.yml │ │ │ ├── haproxy-external-ispn.env │ │ │ ├── haproxy.cfg │ │ │ └── ispn/ │ │ │ ├── Dockerfile │ │ │ ├── cacerts │ │ │ ├── conf/ │ │ │ │ ├── infinispan-keycloak-database.xml │ │ │ │ └── users.properties │ │ │ ├── ispn-server.jks │ │ │ └── ispn-truststore.jks │ │ ├── keycloakx/ │ │ │ ├── Dockerfile │ │ │ ├── cache-custom-jgroups-tcp.xml │ │ │ ├── cache-custom-jgroups.xml │ │ │ ├── cache-custom.xml │ │ │ ├── jgroups-jdbcping-enc.xml │ │ │ ├── jgroups-multicast-diag.xml │ │ │ ├── jgroups-multicast-enc.xml │ │ │ └── jgroups.p12 │ │ ├── nginx/ │ │ │ ├── docker-compose-nginx.yml │ │ │ └── nginx.conf │ │ └── readme.md │ ├── dev/ │ │ ├── docker-compose-ci-github.yml │ │ ├── docker-compose-grafana.yml │ │ ├── docker-compose-graylog.yml │ │ ├── docker-compose-keycloak.yml │ │ ├── docker-compose-keycloakx.yml │ │ ├── docker-compose-mssql.yml │ │ ├── docker-compose-mysql.yml │ │ ├── docker-compose-nats.yml │ │ ├── docker-compose-opa.yml │ │ ├── docker-compose-openldap.yml │ │ ├── docker-compose-oracle.yml │ │ ├── docker-compose-postgres.yml │ │ ├── docker-compose-prometheus.yml │ │ ├── docker-compose-provisioning.yml │ │ ├── docker-compose-simplesaml.yml │ │ ├── docker-compose-tls.yml │ │ ├── docker-compose-tracing-tls.yml │ │ ├── docker-compose-tracing.yml │ │ ├── docker-compose.yml │ │ ├── graylog/ │ │ │ ├── Dockerfile │ │ │ ├── cli/ │ │ │ │ └── 0020-onstart-setup-graylog-logging.cli │ │ │ ├── contentpacks/ │ │ │ │ └── iam-keycloak-content-pack-v1.json │ │ │ └── modules/ │ │ │ └── logstash-gelf-1.14.1/ │ │ │ └── biz/ │ │ │ └── paluch/ │ │ │ └── logging/ │ │ │ └── main/ │ │ │ └── module.xml │ │ ├── keycloak/ │ │ │ └── Dockerfile │ │ ├── keycloak-common.env │ │ ├── keycloak-db.env │ │ ├── keycloak-ext/ │ │ │ └── readme.md │ │ ├── keycloak-http.env │ │ ├── keycloak-openldap.env │ │ ├── keycloak-provisioning.env │ │ ├── keycloak-tls.env │ │ ├── keycloak-tracing.env │ │ ├── keycloakx/ │ │ │ ├── Dockerfile │ │ │ ├── Dockerfile-ci │ │ │ └── health_check.sh │ │ ├── mysql/ │ │ │ └── Dockerfile │ │ ├── nats/ │ │ │ ├── readme.md │ │ │ └── server.conf │ │ ├── oracle/ │ │ │ └── Dockerfile │ │ ├── otel-collector/ │ │ │ └── Dockerfile │ │ ├── postgresql/ │ │ │ └── Dockerfile │ │ ├── simplesaml/ │ │ │ └── idp/ │ │ │ ├── Dockerfile │ │ │ └── authsources.php │ │ └── sqlserver/ │ │ ├── Dockerfile │ │ ├── db-init.sh │ │ ├── db-init.sql │ │ ├── docker-entrypoint.sh │ │ └── mssql.conf │ └── standalone/ │ ├── docker-compose.yml │ ├── keycloak/ │ │ ├── Dockerfile │ │ └── conf/ │ │ ├── keycloak.conf │ │ └── quarkus.properties │ ├── proxy/ │ │ └── nginx.conf │ ├── readme.md │ └── up.sh ├── keycloak/ │ ├── cli/ │ │ ├── 0001-onstart-init.cli │ │ ├── 0010-register-smallrye-extensions.cli │ │ ├── 0020-onstart-setup-graylog-logging.cli │ │ └── 0100-onstart-deploy-extensions.sh │ ├── clisnippets/ │ │ ├── http-client-config.md │ │ ├── json-logging.md │ │ ├── map-keycloak-endpoint-to-custom-endpint.md │ │ ├── offline-sessions-lazy-loading.md │ │ ├── undertow-access.md │ │ └── undertow-request-logging.md │ ├── config/ │ │ ├── jmxremote.password │ │ ├── openid-config.json │ │ └── quarkus.properties │ ├── docker/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── docker/ │ │ ├── keycloak/ │ │ │ ├── Dockerfile.alpine-slim │ │ │ ├── Dockerfile.ci.plain │ │ │ ├── Dockerfile.plain │ │ │ └── custom-docker-entrypoint.sh │ │ └── keycloakx/ │ │ ├── Dockerfile.ci.plain │ │ └── Dockerfile.plain │ ├── e2e-tests/ │ │ ├── .gitignore │ │ ├── cypress/ │ │ │ ├── e2e/ │ │ │ │ └── login/ │ │ │ │ └── login.cy.ts │ │ │ ├── fixtures/ │ │ │ │ ├── messages.json │ │ │ │ └── users.json │ │ │ ├── plugins/ │ │ │ │ └── index.ts │ │ │ ├── support/ │ │ │ │ ├── commands.ts │ │ │ │ └── e2e.ts │ │ │ ├── tsconfig.json │ │ │ └── utils/ │ │ │ └── keycloakUtils.ts │ │ ├── cypress.config.ts │ │ ├── package.json │ │ └── readme.md │ ├── extensions/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── github/ │ │ │ │ └── thomasdarimont/ │ │ │ │ └── keycloak/ │ │ │ │ └── custom/ │ │ │ │ ├── account/ │ │ │ │ │ ├── AccountActivity.java │ │ │ │ │ ├── AccountChange.java │ │ │ │ │ ├── AccountDeletion.java │ │ │ │ │ ├── AccountEmail.java │ │ │ │ │ ├── AccountPostLoginAction.java │ │ │ │ │ ├── MfaChange.java │ │ │ │ │ ├── RequestAccountDeletionActionToken.java │ │ │ │ │ ├── RequestAccountDeletionActionTokenHandler.java │ │ │ │ │ └── console/ │ │ │ │ │ └── AcmeAccountConsoleFactory.java │ │ │ │ ├── admin/ │ │ │ │ │ └── ui/ │ │ │ │ │ └── example/ │ │ │ │ │ └── ExampleUiPageProvider.java │ │ │ │ ├── audit/ │ │ │ │ │ └── AcmeAuditListener.java │ │ │ │ ├── auth/ │ │ │ │ │ ├── authzen/ │ │ │ │ │ │ ├── AuthZen.java │ │ │ │ │ │ └── AuthzenClient.java │ │ │ │ │ ├── checkaccess/ │ │ │ │ │ │ └── CheckAccessAuthenticator.java │ │ │ │ │ ├── confirmcookie/ │ │ │ │ │ │ └── ConfirmCookieAuthenticator.java │ │ │ │ │ ├── customcookie/ │ │ │ │ │ │ └── CustomCookieAuthenticator.java │ │ │ │ │ ├── debug/ │ │ │ │ │ │ └── DebugAuthenticator.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ └── SkippableRequiredAction.java │ │ │ │ │ ├── dynamicidp/ │ │ │ │ │ │ └── DynamicIdpAuthenticator.java │ │ │ │ │ ├── hello/ │ │ │ │ │ │ └── HelloAuthenticator.java │ │ │ │ │ ├── idpselection/ │ │ │ │ │ │ └── AcmeDynamicIdpLookupUsernameForm.java │ │ │ │ │ ├── magiclink/ │ │ │ │ │ │ └── MagicLinkAuthenticator.java │ │ │ │ │ ├── mfa/ │ │ │ │ │ │ ├── MfaInfo.java │ │ │ │ │ │ ├── emailcode/ │ │ │ │ │ │ │ ├── EmailCodeAuthenticatorForm.java │ │ │ │ │ │ │ ├── EmailCodeCredentialModel.java │ │ │ │ │ │ │ ├── EmailCodeCredentialProvider.java │ │ │ │ │ │ │ └── RegisterEmailCodeRequiredAction.java │ │ │ │ │ │ ├── otp/ │ │ │ │ │ │ │ └── AcmeOTPFormAuthenticator.java │ │ │ │ │ │ ├── setup/ │ │ │ │ │ │ │ └── SelectMfaMethodAuthenticator.java │ │ │ │ │ │ └── sms/ │ │ │ │ │ │ ├── PhoneNumberUtils.java │ │ │ │ │ │ ├── SmsAuthenticator.java │ │ │ │ │ │ ├── SmsCodeSender.java │ │ │ │ │ │ ├── client/ │ │ │ │ │ │ │ ├── SmsClient.java │ │ │ │ │ │ │ ├── SmsClientFactory.java │ │ │ │ │ │ │ └── mock/ │ │ │ │ │ │ │ └── MockSmsClient.java │ │ │ │ │ │ ├── credentials/ │ │ │ │ │ │ │ ├── SmsCredentialModel.java │ │ │ │ │ │ │ └── SmsCredentialProvider.java │ │ │ │ │ │ └── updatephone/ │ │ │ │ │ │ └── UpdatePhoneNumberRequiredAction.java │ │ │ │ │ ├── net/ │ │ │ │ │ │ └── NetworkAuthenticator.java │ │ │ │ │ ├── opa/ │ │ │ │ │ │ ├── OpaAccessResponse.java │ │ │ │ │ │ ├── OpaAuthenticator.java │ │ │ │ │ │ ├── OpaCheckAccessAction.java │ │ │ │ │ │ └── OpaClient.java │ │ │ │ │ ├── passwordform/ │ │ │ │ │ │ └── FederationAwarePasswordForm.java │ │ │ │ │ ├── trusteddevice/ │ │ │ │ │ │ ├── TrustedDeviceCookie.java │ │ │ │ │ │ ├── TrustedDeviceName.java │ │ │ │ │ │ ├── TrustedDeviceToken.java │ │ │ │ │ │ ├── action/ │ │ │ │ │ │ │ ├── ManageTrustedDeviceAction.java │ │ │ │ │ │ │ └── TrustedDeviceInfo.java │ │ │ │ │ │ ├── auth/ │ │ │ │ │ │ │ └── TrustedDeviceAuthenticator.java │ │ │ │ │ │ ├── credentials/ │ │ │ │ │ │ │ ├── TrustedDeviceCredentialInput.java │ │ │ │ │ │ │ ├── TrustedDeviceCredentialModel.java │ │ │ │ │ │ │ └── TrustedDeviceCredentialProvider.java │ │ │ │ │ │ └── support/ │ │ │ │ │ │ └── UserAgentParser.java │ │ │ │ │ ├── userpasswordform/ │ │ │ │ │ │ └── AcmeCaptchaUsernamePasswordForm.java │ │ │ │ │ └── verifyemailcode/ │ │ │ │ │ └── VerifyEmailCodeAction.java │ │ │ │ ├── authz/ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ └── AcmeAccessFilter.java │ │ │ │ │ └── policies/ │ │ │ │ │ └── AcmeImpersonationPolicyProvider.java │ │ │ │ ├── config/ │ │ │ │ │ ├── ClientConfig.java │ │ │ │ │ ├── ConfigAccessor.java │ │ │ │ │ ├── MapConfig.java │ │ │ │ │ └── RealmConfig.java │ │ │ │ ├── consent/ │ │ │ │ │ ├── ConsentSelectionAction.java │ │ │ │ │ ├── ScopeBean.java │ │ │ │ │ ├── ScopeField.java │ │ │ │ │ └── ScopeFieldBean.java │ │ │ │ ├── context/ │ │ │ │ │ └── ContextSelectionAction.java │ │ │ │ ├── email/ │ │ │ │ │ └── AcmeEmailSenderProvider.java │ │ │ │ ├── endpoints/ │ │ │ │ │ ├── CorsUtils.java │ │ │ │ │ ├── CustomAdminResourceProvider.java │ │ │ │ │ ├── CustomResource.java │ │ │ │ │ ├── CustomResourceProvider.java │ │ │ │ │ ├── account/ │ │ │ │ │ │ └── AcmeAccountResource.java │ │ │ │ │ ├── admin/ │ │ │ │ │ │ ├── AdminSettingsResource.java │ │ │ │ │ │ ├── CustomAdminResource.java │ │ │ │ │ │ └── UserProvisioningResource.java │ │ │ │ │ ├── applications/ │ │ │ │ │ │ └── ApplicationsInfoResource.java │ │ │ │ │ ├── branding/ │ │ │ │ │ │ └── BrandingResource.java │ │ │ │ │ ├── credentials/ │ │ │ │ │ │ └── UserCredentialsInfoResource.java │ │ │ │ │ ├── demo/ │ │ │ │ │ │ └── DemosResource.java │ │ │ │ │ ├── idp/ │ │ │ │ │ │ └── IdpApplications.java │ │ │ │ │ ├── migration/ │ │ │ │ │ │ ├── TokenMigrationResource.java │ │ │ │ │ │ └── UserImportMigrationResource.java │ │ │ │ │ ├── offline/ │ │ │ │ │ │ ├── OfflineSessionPropagationResource.java │ │ │ │ │ │ ├── SessionPropagationActionToken.java │ │ │ │ │ │ └── SessionPropagationActionTokenHandler.java │ │ │ │ │ ├── profile/ │ │ │ │ │ │ ├── ProfileData.java │ │ │ │ │ │ └── UserProfileResource.java │ │ │ │ │ └── settings/ │ │ │ │ │ └── UserSettingsResource.java │ │ │ │ ├── eventpublishing/ │ │ │ │ │ ├── AcmeEventPublisherEventListener.java │ │ │ │ │ ├── EventPublisher.java │ │ │ │ │ ├── NatsEventPublisher.java │ │ │ │ │ └── NoopPublisher.java │ │ │ │ ├── health/ │ │ │ │ │ ├── CustomHealthChecks.java │ │ │ │ │ └── CustomReadinessCheck.java │ │ │ │ ├── idp/ │ │ │ │ │ ├── azure/ │ │ │ │ │ │ ├── CustomAzureADGroupMapper.java │ │ │ │ │ │ └── CustomEntraIdProfileMapper.java │ │ │ │ │ ├── brokering/ │ │ │ │ │ │ └── RestrictBrokeredUserMapper.java │ │ │ │ │ ├── linking/ │ │ │ │ │ │ └── AcmeIdpLinkAction.java │ │ │ │ │ ├── oidc/ │ │ │ │ │ │ └── AcmeOidcIdentityProvider.java │ │ │ │ │ └── social/ │ │ │ │ │ └── linkedin/ │ │ │ │ │ └── LinkedInUserProfileImportIdpMapper.java │ │ │ │ ├── infinispan/ │ │ │ │ │ └── CustomInfinispanUserSessionProviderFactory.java │ │ │ │ ├── jpa/ │ │ │ │ │ └── CustomQuarkusJpaConnectionProviderFactory.java │ │ │ │ ├── metrics/ │ │ │ │ │ ├── KeycloakMetric.java │ │ │ │ │ ├── KeycloakMetricAccessor.java │ │ │ │ │ ├── KeycloakMetricStore.java │ │ │ │ │ ├── KeycloakMetrics.java │ │ │ │ │ ├── RealmMetricUpdater.java │ │ │ │ │ ├── RealmMetricsUpdater.java │ │ │ │ │ └── events/ │ │ │ │ │ ├── MetricEventListenerProvider.java │ │ │ │ │ └── MetricEventRecorder.java │ │ │ │ ├── migration/ │ │ │ │ │ └── acmecred/ │ │ │ │ │ ├── AcmeCredentialModel.java │ │ │ │ │ ├── AcmeCredentialProvider.java │ │ │ │ │ └── AcmePasswordValidator.java │ │ │ │ ├── oauth/ │ │ │ │ │ ├── client/ │ │ │ │ │ │ └── OauthClientCredentialsTokenManager.java │ │ │ │ │ └── tokenexchange/ │ │ │ │ │ ├── ApiKeyTokenExchangeProvider.java │ │ │ │ │ ├── CustomTokenExchangeProvider.java │ │ │ │ │ └── CustomV2TokenExchangeProvider.java │ │ │ │ ├── oidc/ │ │ │ │ │ ├── ageinfo/ │ │ │ │ │ │ └── AgeInfoMapper.java │ │ │ │ │ ├── authzenclaims/ │ │ │ │ │ │ └── AuthzenClaimMapper.java │ │ │ │ │ ├── opaclaims/ │ │ │ │ │ │ └── OpaClaimMapper.java │ │ │ │ │ ├── remoteclaims/ │ │ │ │ │ │ └── RemoteOidcMapper.java │ │ │ │ │ ├── scopes/ │ │ │ │ │ │ └── OnlyGrantedScopesMapper.java │ │ │ │ │ ├── userdata/ │ │ │ │ │ │ └── AcmeUserInfoMapper.java │ │ │ │ │ └── wellknown/ │ │ │ │ │ └── AcmeOidcWellKnownProvider.java │ │ │ │ ├── profile/ │ │ │ │ │ ├── AcmeUserAttributes.java │ │ │ │ │ ├── emailupdate/ │ │ │ │ │ │ └── UpdateEmailRequiredAction.java │ │ │ │ │ └── phonenumber/ │ │ │ │ │ └── AcmePhoneValidator.java │ │ │ │ ├── registration/ │ │ │ │ │ ├── actiontokens/ │ │ │ │ │ │ └── AcmeExecuteActionsActionTokenHandler.java │ │ │ │ │ └── formaction/ │ │ │ │ │ ├── CustomRegistrationUserCreation.java │ │ │ │ │ └── WelcomeEmailFormAction.java │ │ │ │ ├── saml/ │ │ │ │ │ ├── AcmeSamlAuthenticationPreprocessor.java │ │ │ │ │ ├── brokering/ │ │ │ │ │ │ └── AcmeSamlRoleImporter.java │ │ │ │ │ └── rolelist/ │ │ │ │ │ └── AcmeSamlRoleListMapper.java │ │ │ │ ├── scheduling/ │ │ │ │ │ ├── ScheduledTaskProvider.java │ │ │ │ │ ├── ScheduledTaskProviderFactory.java │ │ │ │ │ ├── ScheduledTaskSpi.java │ │ │ │ │ └── tasks/ │ │ │ │ │ └── AcmeScheduledTaskProvider.java │ │ │ │ ├── security/ │ │ │ │ │ ├── filter/ │ │ │ │ │ │ └── IpAccessFilter.java │ │ │ │ │ └── friendlycaptcha/ │ │ │ │ │ ├── FriendlyCaptcha.java │ │ │ │ │ ├── FriendlyCaptchaClient.java │ │ │ │ │ ├── FriendlyCaptchaConfig.java │ │ │ │ │ └── FriendlyCaptchaFormAction.java │ │ │ │ ├── support/ │ │ │ │ │ ├── AuthUtils.java │ │ │ │ │ ├── ConfigUtils.java │ │ │ │ │ ├── CookieHelper.java │ │ │ │ │ ├── CookieUtils.java │ │ │ │ │ ├── CredentialUtils.java │ │ │ │ │ ├── LocaleUtils.java │ │ │ │ │ ├── RealmUtils.java │ │ │ │ │ ├── RequiredActionUtils.java │ │ │ │ │ ├── ScopeUtils.java │ │ │ │ │ ├── TokenUtils.java │ │ │ │ │ ├── UserSessionUtils.java │ │ │ │ │ └── UserUtils.java │ │ │ │ ├── terms/ │ │ │ │ │ └── AcmeTermsAndConditionsAction.java │ │ │ │ ├── themes/ │ │ │ │ │ └── login/ │ │ │ │ │ ├── AcmeFreeMarkerLoginFormsProvider.java │ │ │ │ │ ├── AcmeLoginBean.java │ │ │ │ │ └── AcmeUrlBean.java │ │ │ │ └── userstorage/ │ │ │ │ ├── adhoc/ │ │ │ │ │ └── AdhocUserStorageProvider.java │ │ │ │ ├── ldap/ │ │ │ │ │ ├── AcmeLDAPStorageProvider.java │ │ │ │ │ └── AcmeReadonlyLDAPUserModelDelegate.java │ │ │ │ └── remote/ │ │ │ │ ├── AcmeUserAdapter.java │ │ │ │ ├── AcmeUserStorageProvider.java │ │ │ │ └── accountclient/ │ │ │ │ ├── AccountClientOptions.java │ │ │ │ ├── AcmeAccountClient.java │ │ │ │ ├── AcmeUser.java │ │ │ │ ├── SimpleAcmeAccountClient.java │ │ │ │ ├── UserSearchInput.java │ │ │ │ ├── UserSearchOutput.java │ │ │ │ ├── VerifyCredentialsInput.java │ │ │ │ └── VerifyCredentialsOutput.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── keycloak-scripts.json │ │ │ ├── ignore_default-persistence.xml │ │ │ ├── my-script-authenticator.js │ │ │ └── my-script-mapper.js │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── github/ │ │ │ └── thomasdarimont/ │ │ │ └── keycloak/ │ │ │ └── custom/ │ │ │ ├── BoostrapTest.java │ │ │ ├── KeycloakEnvironment.java │ │ │ ├── KeycloakIntegrationTest.java │ │ │ └── KeycloakTestSupport.java │ │ └── resources/ │ │ ├── log4j.properties │ │ └── testcontainers.properties │ ├── http-tests/ │ │ ├── advanced_oauth_par.http │ │ ├── advanced_oauth_resources.http │ │ ├── custom-token-migration.http │ │ ├── custom_token_exchange.http │ │ ├── dynamic-client-registration.http │ │ ├── example-requests.http │ │ ├── grant_type_client_credentials-requests.http │ │ ├── grant_type_password-requests.http │ │ ├── grant_type_refreshtoken-requests.http │ │ ├── http-client.env.json │ │ ├── implicit-flow-request.http │ │ ├── keycloak-lightweight-token-requests.http │ │ ├── oidc-endpoint-requests.http │ │ ├── token_exchange.http │ │ ├── token_exchange_api_gateway.http │ │ ├── token_exchange_fed-identity-chaining.http │ │ └── token_exchange_v2.http │ ├── misc/ │ │ ├── custom-keycloak-server/ │ │ │ ├── pom.xml │ │ │ ├── readme.md │ │ │ └── src/ │ │ │ └── main/ │ │ │ ├── copy-to-keycloak/ │ │ │ │ └── conf/ │ │ │ │ └── quarkus.properties │ │ │ ├── java/ │ │ │ │ └── demo/ │ │ │ │ └── events/ │ │ │ │ └── MyEventListener.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ ├── keycloak-themes.json │ │ │ │ └── keycloak.conf │ │ │ └── theme/ │ │ │ └── custom/ │ │ │ └── login/ │ │ │ ├── messages/ │ │ │ │ └── messages_en.properties │ │ │ ├── resources/ │ │ │ │ ├── css/ │ │ │ │ │ └── custom-login.css │ │ │ │ └── js/ │ │ │ │ └── custom-login.js │ │ │ └── theme.properties │ │ └── snippets/ │ │ ├── create-keycloak-config-cli-client.txt │ │ ├── jgroups-debugging.txt │ │ ├── jmx-config-keycloakx.md │ │ ├── jmx-config-wildfly.md │ │ ├── jvm-settings.txt │ │ ├── keycloakx-cli.md │ │ ├── metrics-examples.txt │ │ └── overlay-keycloak-endpoint-undertow.txt │ ├── patches/ │ │ ├── keycloak-model-infinispan-patch/ │ │ │ ├── pom.xml │ │ │ ├── readme.md │ │ │ └── src/ │ │ │ └── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── keycloak/ │ │ │ ├── models/ │ │ │ │ └── sessions/ │ │ │ │ └── infinispan/ │ │ │ │ └── CacheDecorators.java │ │ │ └── patch/ │ │ │ └── infinispan/ │ │ │ └── keymappers/ │ │ │ └── CustomDefaultTwoWayKey2StringMapper.java │ │ ├── wildfly-clustering-infinispan-extension-patch/ │ │ │ ├── pom.xml │ │ │ ├── readme.md │ │ │ └── src/ │ │ │ └── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── jboss/ │ │ │ └── as/ │ │ │ └── clustering/ │ │ │ └── infinispan/ │ │ │ └── subsystem/ │ │ │ ├── InfinispanSubsystemXMLReader.java │ │ │ ├── LocalDescriptions.properties │ │ │ ├── RemoteStoreResourceDefinition.java │ │ │ ├── RemoteStoreServiceConfigurator.java │ │ │ ├── XMLAttribute.java │ │ │ └── remote/ │ │ │ └── RemoteCacheContainerResourceDefinition.java │ │ ├── wildfly-clustering-infinispan-extension-patch-25.0.x/ │ │ │ ├── pom.xml │ │ │ └── src/ │ │ │ └── main/ │ │ │ └── java/ │ │ │ └── org/ │ │ │ └── jboss/ │ │ │ └── as/ │ │ │ └── clustering/ │ │ │ └── infinispan/ │ │ │ └── subsystem/ │ │ │ ├── InfinispanSubsystemXMLReader.java │ │ │ ├── LocalDescriptions.properties │ │ │ ├── RemoteStoreResourceDefinition.java │ │ │ ├── RemoteStoreServiceConfigurator.java │ │ │ └── remote/ │ │ │ └── RemoteCacheContainerResourceDefinition.java │ │ └── wildfly-clustering-infinispan-extension-patch-26.0.x/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── org/ │ │ └── jboss/ │ │ └── as/ │ │ └── clustering/ │ │ └── infinispan/ │ │ └── subsystem/ │ │ ├── InfinispanSubsystemXMLReader.java │ │ ├── LocalDescriptions.properties │ │ ├── RemoteStoreResourceDefinition.java │ │ └── RemoteStoreServiceConfigurator.java │ └── themes/ │ ├── acme-account.v2/ │ │ └── account/ │ │ ├── messages/ │ │ │ ├── messages_de.properties │ │ │ └── messages_en.properties │ │ ├── resources/ │ │ │ ├── content.json │ │ │ └── css/ │ │ │ └── styles.css │ │ └── theme.properties │ ├── admin-custom/ │ │ └── admin/ │ │ ├── admin-settings.ftl │ │ ├── resources/ │ │ │ └── js/ │ │ │ └── admin-settings.js │ │ └── theme.properties │ ├── apps/ │ │ └── login/ │ │ ├── login.ftl │ │ ├── messages/ │ │ │ ├── messages_de.properties │ │ │ └── messages_en.properties │ │ ├── register.ftl │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── custom-login.css │ │ │ └── js/ │ │ │ └── custom-login.js │ │ ├── terms.ftl │ │ └── theme.properties │ ├── custom/ │ │ └── login/ │ │ ├── messages/ │ │ │ └── messages_en.properties │ │ ├── register.ftl │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── custom-login.css │ │ │ └── js/ │ │ │ └── custom-login.js │ │ └── theme.properties │ ├── internal/ │ │ ├── account/ │ │ │ ├── account.ftl │ │ │ ├── messages/ │ │ │ │ ├── messages_de.properties │ │ │ │ └── messages_en.properties │ │ │ └── theme.properties │ │ ├── email/ │ │ │ ├── html/ │ │ │ │ ├── acme-account-blocked.ftl │ │ │ │ ├── acme-account-deletion-requested.ftl │ │ │ │ ├── acme-account-updated.ftl │ │ │ │ ├── acme-email-verification-with-code.ftl │ │ │ │ ├── acme-magic-link.ftl │ │ │ │ ├── acme-mfa-added.ftl │ │ │ │ ├── acme-mfa-removed.ftl │ │ │ │ ├── acme-passkey-added.ftl │ │ │ │ ├── acme-passkey-removed.ftl │ │ │ │ ├── acme-trusted-device-added.ftl │ │ │ │ ├── acme-trusted-device-removed.ftl │ │ │ │ ├── acme-welcome.ftl │ │ │ │ ├── code-email.ftl │ │ │ │ └── template.ftl │ │ │ ├── messages/ │ │ │ │ ├── messages_de.properties │ │ │ │ └── messages_en.properties │ │ │ ├── text/ │ │ │ │ ├── acme-account-blocked.ftl │ │ │ │ ├── acme-account-deletion-requested.ftl │ │ │ │ ├── acme-account-updated.ftl │ │ │ │ ├── acme-email-verification-with-code.ftl │ │ │ │ ├── acme-magic-link.ftl │ │ │ │ ├── acme-mfa-added.ftl │ │ │ │ ├── acme-mfa-removed.ftl │ │ │ │ ├── acme-passkey-added.ftl │ │ │ │ ├── acme-passkey-removed.ftl │ │ │ │ ├── acme-trusted-device-added.ftl │ │ │ │ ├── acme-trusted-device-removed.ftl │ │ │ │ ├── acme-welcome.ftl │ │ │ │ ├── code-email.ftl │ │ │ │ └── template.ftl │ │ │ └── theme.properties │ │ └── login/ │ │ ├── email-code-form.ftl │ │ ├── login-confirm-cookie-form.ftl │ │ ├── login-magic-link.ftl │ │ ├── login-otp.ftl │ │ ├── login-password.ftl │ │ ├── login-select-mfa-method.ftl │ │ ├── login-skippable-action.ftl │ │ ├── login-sms.ftl │ │ ├── login-username.ftl │ │ ├── manage-trusted-device-form.ftl │ │ ├── messages/ │ │ │ ├── messages_de.properties │ │ │ └── messages_en.properties │ │ ├── register.ftl │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── custom-login.css │ │ │ └── js/ │ │ │ └── custom-login.js │ │ ├── select-consent-form.ftl │ │ ├── theme.properties │ │ ├── update-email-form.ftl │ │ ├── update-phone-number-form.ftl │ │ ├── verify-email-form.ftl │ │ └── verify-phone-number-form.ftl │ ├── internal-modern/ │ │ ├── account/ │ │ │ └── theme.properties │ │ ├── email/ │ │ │ ├── messages/ │ │ │ │ ├── messages_de.properties │ │ │ │ └── messages_en.properties │ │ │ └── theme.properties │ │ └── login/ │ │ ├── context-selection.ftl │ │ ├── login-applications.ftl │ │ ├── login-idp-selection.ftl │ │ ├── login-password.ftl │ │ ├── login-username.ftl │ │ ├── login-verify-email.ftl │ │ ├── login.ftl │ │ ├── messages/ │ │ │ ├── messages_de.properties │ │ │ └── messages_en.properties │ │ ├── register.ftl │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── custom-modern-login.css │ │ │ └── js/ │ │ │ └── custom-modern-login.js │ │ ├── select-authenticator.ftl │ │ ├── template.ftl │ │ └── theme.properties │ ├── minimal/ │ │ └── login/ │ │ ├── resources/ │ │ │ ├── css/ │ │ │ │ └── custom-login.css │ │ │ └── js/ │ │ │ └── custom-login.js │ │ └── theme.properties │ └── minimal-branding/ │ └── login/ │ ├── customizations.ftl │ ├── info.ftl │ ├── login-update-password.ftl │ ├── resources/ │ │ ├── css/ │ │ │ └── custom-login.css │ │ └── js/ │ │ └── custom-login.js │ ├── template.ftl │ └── theme.properties ├── keycloak.env ├── maven-settings.xml ├── pom.xml ├── readme.md ├── start.java ├── stop.java └── tools/ ├── kcadm/ │ └── readme.md ├── postman/ │ ├── acme.postman_collection.json │ ├── acme.postman_environment_http.json │ ├── acme.postman_environment_https.json │ ├── acme.postman_globals.json │ └── readme.md ├── session-generator/ │ ├── .gitignore │ ├── .mvn/ │ │ └── wrapper/ │ │ ├── MavenWrapperDownloader.java │ │ └── maven-wrapper.properties │ ├── mvnw │ ├── mvnw.cmd │ ├── pom.xml │ └── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── github/ │ │ │ └── thomasdarimont/ │ │ │ └── keycloak/ │ │ │ └── tools/ │ │ │ └── sessiongenerator/ │ │ │ └── SessionGeneratorApplication.java │ │ └── resources/ │ │ └── application.properties │ └── test/ │ └── java/ │ └── com/ │ └── github/ │ └── thomasdarimont/ │ └── keycloak/ │ └── tools/ │ └── sessiongenerator/ │ └── SessionGeneratorApplicationTests.java └── tcpdump/ ├── Dockerfile └── readme.md