Keycloak reCAPTCHA Alternative for European Teams (2026)

Keycloak reCAPTCHA alternative illustration for European teams, showing an “I’m not a robot” checkbox replaced by a .eu user verification system with a security shield, EU flag, and European country icons.
captcha.eu

Keycloak ships with reCAPTCHA built into its registration flow. For European organisations, that default creates cookies, US data transfers, and a privacy documentation burden on the three flows that matter most: login, registration and password reset. This guide explains how to replace reCAPTCHA in Keycloak with a cookieless, EU-hosted alternative and walks through the exact configuration for each authentication flow.

Estimated reading time: 14 minutes


The core problem

Keycloak’s built-in reCAPTCHA sets the _grecaptcha cookie, routes verification through Google infrastructure, and creates ePrivacy consent questions on your most sensitive authentication flows.

Why auth flows are different

Login, registration, and password reset are pages users must complete before they can access anything. Third-party dependencies here carry more compliance and security weight than on a standard contact form.

The practical fix

A proof-of-work CAPTCHA plugin installed as a JAR: no cookies, no US transfers, no cookie-consent layer for the CAPTCHA itself, with a much simpler third-party review profile, and configurable per Keycloak flow in under an hour.


Who this guide is for

This article is written for IAM admins, security teams, platform engineers and public-sector or regulated organisations that run Keycloak in production and need a practical replacement path for reCAPTCHA across login, registration, and password reset flows.


Most reCAPTCHA discussions focus on contact forms. Keycloak is a different situation entirely. It is an identity and access management system: the layer that controls who can log in, create an account, or recover a password across your applications. That means reCAPTCHA here sits on authentication flows, not marketing pages.

For European organisations running Keycloak in production, this creates three issues that are more serious than on a typical website form.

Enterprise and public-sector Keycloak deployments attract the strictest reviews. DPOs, procurement committees, and security architects ask harder questions about third-party scripts on authentication pages than on any other part of a website. A CAPTCHA that introduces no cookies, no US data routing, and a much simpler third-party review profile is structurally easier to defend, and faster to approve.

The _grecaptcha cookie runs on authentication pages. Google confirmed this cookie persists after the April 2026 processor model change. On a login page that employees or customers must complete before they can access any service, they cannot meaningfully opt out of a cookie that protects the very flow they need to use. This is harder to resolve than the same cookie on a contact form.

Verification routes through Google infrastructure. For organisations in regulated sectors such as healthcare, finance, or the public sector, processing personal data via US infrastructure requires active transfer documentation under GDPR. On an authentication system that handles credentials, this adds governance overhead that security and compliance teams would rather avoid entirely.

Authentication pages carry a higher security standard

Unlike a contact form, authentication flows handle credentials and session tokens. When a third-party CAPTCHA service runs on the same page, it shares the browser context with those flows. For regulated-sector Keycloak deployments, this goes beyond the standard cookie-consent question and into security architecture review territory.


Several CAPTCHA providers offer Keycloak plugins, but the market is much more constrained here than for WordPress or TYPO3. Most community extensions break on Keycloak major version upgrades and receive limited maintenance. The Keycloak CAPTCHA ecosystem is much smaller than the WordPress or TYPO3 ecosystem. In practice, most teams evaluating a modern Keycloak CAPTCHA layer look at CAPTCHA.eu, Friendly Captcha, legacy reCAPTCHA, and a small number of community-maintained options such as ALTCHA or hCaptcha integrations.

SOLUTION
COOKIES
DATA LOCATION
FLOWS COVERED
PLUGIN TYPE
VERSION REQUIREMENT
CAPTCHA.eu
No
Austria (EU)
Login, Registration, Password Reset
Official JAR
Keycloak 22.0.3+
Friendly Captcha
No
Dedicated EU-only endpoint from Advanced plan. Lower tiers may use global infrastructure.
Login, Registration, Password Reset
Official plugin
Keycloak 26.1.0+ and Java 17+ required
hCaptcha
Yes
US-based
Registration only
Community JAR
Limited maintenance
ALTCHA
No
Your own infrastructure
Registration only
Community JAR
Self-hosted backend required
reCAPTCHA v2
Yes (_grecaptcha)
US-based
Registration (built-in only)
Built-in
Login and Reset require custom extensions
This comparison is written by the CAPTCHA.eu team and includes our own product. We aim to characterise all solutions fairly based on current public documentation. Where configuration changes the answer, we say so explicitly. Check current documentations for the latest position.

Keycloak organises authentication as configurable flows, which are independent sequences that you modify separately in the Admin Console. Understanding what each flow does helps you decide which ones to protect first and why.

The browser (login) flow is the standard login page that users see when they access a Keycloak-protected application. It carries the highest traffic volume and is the primary target for credential stuffing and brute-force attacks: automated attempts to access accounts using stolen or guessed credentials at scale.

The registration flow covers account creation. Without CAPTCHA protection here, bots create fake accounts in bulk, which degrades service quality, skews user analytics, and enables abuse of trial periods, referral programs, or free tiers.

The reset credentials flow handles password recovery. Attackers target it to trigger recovery emails at scale, overload mail infrastructure, enumerate which usernames exist in the system, or probe for account takeover opportunities. It is the least-discussed of the three and often the last one teams think to protect. Leaving it open while protecting the other two creates a gap.

One important limitation to know upfront: Keycloak’s built-in reCAPTCHA only protects the registration flow natively. To protect login and password reset with reCAPTCHA, you need custom extensions. CAPTCHA.eu covers all three with the same JAR and follows the same configuration pattern for each, which is one reason teams find the migration straightforward.


Before you install anything, check your Keycloak version. It affects which alternatives are available to you.

If you run Keycloak 26.1.0 or later with Java 17 or later, both CAPTCHA.eu and Friendly Captcha are available. Both offer officially maintained plugins covering all three flows. CAPTCHA.eu also supports Keycloak 22.0.3 and later, which makes it a fit for teams running older installations.

If you run an older Keycloak version (Keycloak 24.x, 25.x, or anything below 26.1.0), Friendly Captcha’s Keycloak plugin is not compatible. Their plugin explicitly requires Keycloak 26.1.0+ and Java 17+. CAPTCHA.eu supports a broader version range.

If you run Red Hat Build of Keycloak (RHBK) or the older Red Hat SSO product, the version mapping differs from upstream Keycloak. RHBK 24 corresponds roughly to upstream Keycloak 24. Verify against the plugin’s documented compatibility before rolling out to production.

How to check your Keycloak version

Log in to the Keycloak Admin Console. The version number appears in the bottom-left corner of the admin UI. Alternatively, check the server startup logs or run bin/kc.sh --version from your Keycloak installation directory.


The installation is a one-time step that applies to all three flows. Once the JAR is in place, you configure each flow separately in the Admin Console.

  • Download and install the JAR

    Download the CAPTCHA.eu Keycloak plugin from the plugin page. Copy keycloak-captcha.jar from the target/ directory into your Keycloak providers/ folder. Then restart Keycloak to load the new provider.

  • Create your CAPTCHA.eu domain and get your keys

    Register at captcha.eu. In the Dashboard, create a domain entry for your Keycloak realm. This generates your Public Key and REST Key, and you will need both when configuring each flow below.


  • Duplicate the browser flow

    In the Keycloak Admin Console, go to Authentication and select browser . Click Action > Duplicate to create a working copy. This protects the default flow so you can revert if needed.

  • Remove the default Username Password Form

    Delete the Username Password Form execution from the duplicated flow. CAPTCHA.eu replaces this step with its own combined form that includes CAPTCHA verification.

  • Add the CAPTCHA.eu login form

    Click Add New Step inside the browser forms group. Search for and select captcha.eu: Username Password Form. Click the settings icon, paste your Public Key and REST Key, and save.

  • Bind the flow

    Click Action > Bind flow and select Browser flow. This activates your modified flow for all logins in this realm.

  • Add the frontend snippet to login.ftl

    Add the following snippet to your Keycloak theme’s login.ftl file, right after the closing </form> tag:

If you prefer not to edit your theme manually, use the pre-built theme included in the CAPTCHA.eu extension source at /theme/captcha.


  • Duplicate the registration flow

    Go to Authentication > registration and click Action > Duplicate

  • Replace the existing CAPTCHA execution

    Delete the reCAPTCHA execution if it is present. Then click Add New Step and select captcha.eu: Registration. Set its requirement to Required, configure your Public Key and REST Key in the settings and save.

  • Bind the flow and add the frontend snippet

    Bind via Action > Bind flow > Registration flow. Then add this snippet to register.ftl after the closing </form> tag:


  • Duplicate the reset credentials flow

    Go to Authentication > reset credentials and click Action > Duplicate.

  • Replace the Choose User execution

    Delete the Choose User execution. Click Add New Step and select captcha.eu: Choose User. Configure your Public Key and REST Key in the settings and save.

  • Bind the flow and add the frontend snippet

    Bind via Action > Bind flow > Reset credentials flow. Add this snippet to login-reset-password.ftl after the closing </form> tag:

Protect Keycloak login, registration and password reset

Austria-hosted, no cookies, officially maintained plugin covering all three authentication flows. 100 free verifications to start.


How you install the JAR depends on how you run Keycloak. The Admin Console configuration steps are identical in all cases. Only the file placement differs.

Standard installation (bare-metal or VM): Copy keycloak-captcha.jar directly into the providers/ directory of your Keycloak installation and restart. Keycloak picks up the new provider automatically on startup.

Docker: Add the JAR at build time using a COPY instruction in your Dockerfile, or mount it at runtime via a volume. The providers directory inside the container is typically at /opt/keycloak/providers/. A minimal Dockerfile approach looks like this:

Kubernetes: Mount the JAR using an initContainer that copies it into a shared volume, or use a ConfigMap if your cluster supports binary data. The most reliable production approach is building a custom Keycloak image with the JAR baked in, then referencing it in your Deployment manifest. This avoids volume mounting complexity and keeps your deployment reproducible.

Red Hat Build of Keycloak (RHBK) and Red Hat SSO: RHBK follows the same providers directory approach as upstream Keycloak, but the version numbers differ. RHBK 24 corresponds roughly to upstream Keycloak 24. If you run Red Hat SSO 7.x, the older product based on a different Keycloak version, verify plugin compatibility carefully before deploying to production. The CAPTCHA.eu plugin page documents current compatibility; when in doubt, test on a staging realm first.

Test on a staging realm before going to production

Keycloak lets you create multiple realms in the same installation. Before rolling out CAPTCHA.eu on your production realm, configure it on a dedicated test realm and run login, registration, and password reset end to end. This takes about fifteen minutes and catches any theme or flow configuration issues before they affect real users.


Once all three flows are configured, a quick verification pass confirms everything is working before you treat the migration as complete.

In the CAPTCHA.eu Dashboard, open your domain and check the verification log. After submitting each protected flow (login, registration, password reset), you should see corresponding verification events appear in the log within seconds. If a flow is missing from the log, the CAPTCHA.eu step is not active for that flow. Return to the Admin Console and check that the flow is correctly bound.

On the frontend, submit a test entry for each flow on both desktop and mobile. The verification should complete silently in the background with no visible challenge. If you see an error or the form refuses to submit, check that the Public Key in the plugin settings matches the one in your CAPTCHA.eu Dashboard, and that your FTL snippet references the correct form element ID for each flow.

For Kubernetes deployments, also verify that the JAR is correctly loaded after a pod restart by checking Keycloak startup logs for the provider registration confirmation. If the provider does not appear in the logs, the JAR is not being picked up. Recheck the volume mount or image build.


The technical migration covers the CAPTCHA layer. These steps complete the compliance picture.

Update your privacy notice. Remove the reCAPTCHA entry and replace it with a short CAPTCHA.eu entry that names Austria as the processing location and bot protection on authentication flows as the purpose.

Review your consent management setup. If your Keycloak deployment included any cookie disclosure for reCAPTCHA, remove or revise that entry. For CAPTCHA.eu, no cookie-based consent mechanism is needed for the CAPTCHA layer itself. Session cookies and OIDC tokens are separate and unaffected.

Update your processing records. Replace Google as the CAPTCHA-related processor in your Article 30 records. A standard DPA is available from CAPTCHA.eu for this purpose.

Confirm with your security and DPO teams. For enterprise and regulated-sector deployments, confirm the authentication flow changes with your security architect and DPO before go-live. This is standard practice for any authentication system change.

Why this takes less time than teams expect

The same pattern repeats three times: duplicate flow, replace one execution, configure keys, bind, add FTL snippet. After the login flow, registration and password reset each take about five minutes. Total migration time for all three flows, including testing, is typically under ninety minutes, even for teams new to Keycloak flow configuration.


Does CAPTCHA.eu work with my Keycloak version?

The CAPTCHA.eu plugin works via Keycloak’s Authentication SPI and supports a broad version range. Check the plugin page for the current compatibility matrix. For reference: Friendly Captcha’s Keycloak plugin requires Keycloak 26.1.0 or later and Java 17 or later. If you run an older version, CAPTCHA.eu maintains options available to you.

Do I still need a cookie consent banner after switching?

Not for the CAPTCHA layer itself. CAPTCHA.eu sets no cookies for the CAPTCHA function, which removes the specific consent trigger that reCAPTCHA introduces on authentication pages. Session cookies and OIDC tokens are separate from this and unaffected by the switch.

Can I protect only some flows and leave others unchanged?

Yes. Each Keycloak flow is configured independently, so you can protect registration only, or login and registration, or all three. Most teams start with registration (the highest volume of automated abuse) and then add login and password reset. Leaving password reset unprotected while protecting the other two creates a gap, so plan to cover all three flows.

What happens if I have a custom Keycloak theme?

Add the frontend snippets to your existing theme templates: login.ftl, register.ftl, and login-reset-password.ftl. Each snippet goes after the closing tag of its respective template. If you prefer a fresh start, the CAPTCHA.eu extension includes a pre-built theme at /theme/captcha that you can use as a base.

How is CAPTCHA.eu different from Friendly Captcha for Keycloak?

Both provide official Keycloak plugins with proof-of-work verification and no cookies. The practical differences: CAPTCHA.eu supports a broader Keycloak version range: Friendly Captcha requires Keycloak 26.1.0+ and Java 17+, which rules it out for teams on older installations. CAPTCHA.eu also includes Austria-hosted processing on every commercial plan by default, while Friendly Captcha’s dedicated EU-only endpoint requires the Advanced plan at €200/month or above.

Should I also enable Keycloak’s built-in brute force protection?

Yes, and the two mechanisms complement each other well. CAPTCHA.eu stops automated bots from reaching the point of submitting credentials at all. Keycloak’s built-in brute force detection then handles the cases that slip through by temporarily locking accounts after repeated failures. Running both gives you defense in depth. See our guide on preventing brute force attacks for the broader strategy.

Is CAPTCHA.eu suitable for enterprise SSO deployments?

Yes. CAPTCHA.eu is used by organisations including ÖBB, OeNB, and DGUV: environments where authentication security and procurement documentation both receive formal review. Austria-hosted processing and TÜV Austria WCAG 2.2 AA certification provide the documented evidence that enterprise and public-sector security reviews typically require.



Primary sources
CAPTCHA.eu Keycloak plugin page: official installation guide and FTL snippets for all three flows
Friendly Captcha Keycloak integration page: confirms Keycloak 26.1.0+ and Java 17+ requirements
keycloak-altcha (GitHub): community ALTCHA extension for Keycloak, registration flow only
Keycloak GitHub issue #41057: community discussion on native non-Google CAPTCHA support in Keycloak
Google reCAPTCHA FAQ (April 2026): confirms the _grecaptcha cookie remains after the processor model change
CAPTCHA.eu WCAG 2.2 AA certification: independently certified by TÜV Austria
Transparency: This article is written by the CAPTCHA.eu team and includes our own product. Competitor options are characterised based on current public documentation. If you find an inaccuracy, contact us and we will correct it.

Try the European alternative built for privacy-first deployments

If your team needs low-friction bot protection with Austrian hosting, no cookies at the CAPTCHA layer, EU-based processing, transparent pricing, and TÜV-certified accessibility, test CAPTCHA.eu on a real flow before you decide. Start with your login, sign-up, or contact form. 100 free requests, no credit card required.

en_USEnglish