I’m using keycloak 26.4.2. For some realms I don’t want the email / password login form to be displayed at all. Instead, I want only the external idp buttons to show.
For example, assume I have a google oidc idp and a saml idp. When redirected to keycloak I only want to see those two options for logging in.
Both grok and chatgpt seem to think this is possible but it doesn’t work for me. Basically they both say:
- Copy the existing “browser” flow
- Bind it to the “Browser flow”
- In the “Copy of browser” flow set the “Identity Provider Redirector” execution to “Alternative” but leave it’s configuration empty. As in don’t specify a “Default Identity Provider”.
- In the “Copy of browser” flow set the “Organization” flow to “Disabled”.
- In the “Copy of browser” flow set the “forms” flow to “Disabled”.
This doesn’t work and when login is initiated I see a keycloak screen that says:
- We are sorry…
- Invalid username or password
The keycloak logs show the following:
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'scope' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'response_type' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'redirect_uri' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'state' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'nonce' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.request.AuthzEndpointRequestParser] (executor-thread-192) The additional OIDC param 'client_id' is well known. Continue with the other additional parameters.
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.oidc.endpoints.AuthorizationEndpointChecker] (executor-thread-192) PKCE non-supporting Client
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.services.managers.AuthenticationSessionManager] (executor-thread-192) Found AUTH_SESSION_ID cookie with value NDE5YzVkNDUtNmQ1YS0wNDIyLWE3OWUtZDY5YzFlOTc0OGM5LjBtUWtEdGJ1cGJ0WFltQWtXc3JOclRlTmJZdWdzbGpFMmpoMkdzWFc1amJZb2hHX1dJWUxFT0pEdXRKeXBBNmYtcGtNbHBxaUE3UGdiTUJhLVZ6QVNR
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,105 DEBUG [org.keycloak.protocol.AuthorizationEndpointBase] (executor-thread-192) Sent request to authz endpoint. Root authentication session with ID '419c5d45-6d5a-0422-a79e-d69c1e9748c9' exists. Client is 'jeffvictortech' . Created new authentication session with tab ID: 6SidOxqkbwI
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationProcessor] (executor-thread-192) AUTHENTICATE
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationProcessor] (executor-thread-192) AUTHENTICATE ONLY
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) processFlow: Copy of browser
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) check execution: 'auth-cookie', requirement: 'ALTERNATIVE'
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) authenticator: auth-cookie
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationSelectionResolver] (executor-thread-192) Going through the flow 'Copy of browser' for adding executions
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationSelectionResolver] (executor-thread-192) Selections when trying execution 'auth-cookie' : [ authSelection - auth-cookie, authSelection - identity-provider-redirector]
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) invoke authenticator.authenticate: auth-cookie
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.services.managers.AuthenticationManager] (executor-thread-192) Could not find cookie: KEYCLOAK_IDENTITY
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) authenticator ATTEMPTED: auth-cookie
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) check execution: 'identity-provider-redirector', requirement: 'ALTERNATIVE'
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) authenticator: identity-provider-redirector
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationSelectionResolver] (executor-thread-192) Going through the flow 'Copy of browser' for adding executions
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.AuthenticationSelectionResolver] (executor-thread-192) Selections when trying execution 'identity-provider-redirector' : [ authSelection - identity-provider-redirector]
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) invoke authenticator.authenticate: identity-provider-redirector
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 DEBUG [org.keycloak.authentication.DefaultAuthenticationFlow] (executor-thread-192) authenticator ATTEMPTED: identity-provider-redirector
jeffvictortech-keycloak-1 | 2025-10-28 01:58:15,106 WARN [org.keycloak.services] (executor-thread-192) KC-SERVICES0013: Failed authentication: org.keycloak.authentication.AuthenticationFlowException
jeffvictortech-keycloak-1 | at org.keycloak.authentication.AuthenticationProcessor.authenticateOnly(AuthenticationProcessor.java:1125)
nginx-1 | 172.22.0.1 - - [28/Oct/2025:01:58:15 +0000] "GET /realms/jeffvictortech.local/protocol/openid-connect/auth?response_type=code&client_id=jeffvictortech&scope=openid&state=ycKrdtpHpZZTALTIvfvY0zarke4f6GVQc3i003krYp8%3D&redirect_uri=http://jeffvictortech.local:18086/login/oauth2/code/jeffvictortech.local&nonce=0HN9ZWYZGuFH-qXqknuGhbIdbZYNXoSlr1GqT3aD-uw HTTP/2.0" 400 4095 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
jeffvictortech-keycloak-1 | at org.keycloak.authentication.AuthenticationProcessor.authenticate(AuthenticationProcessor.java:955)
jeffvictortech-keycloak-1 | at org.keycloak.protocol.AuthorizationEndpointBase.handleBrowserAuthenticationRequest(AuthorizationEndpointBase.java:147)
jeffvictortech-keycloak-1 | at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildAuthorizationCodeAuthorizationResponse(AuthorizationEndpoint.java:397)
jeffvictortech-keycloak-1 | at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.process(AuthorizationEndpoint.java:235)
jeffvictortech-keycloak-1 | at org.keycloak.protocol.oidc.endpoints.AuthorizationEndpoint.buildGet(AuthorizationEndpoint.java:119)
Is it possible to do hide the email / password form through some sort of configuration alone? Or is this only possible by customizing the login theme and hiding the form there?