<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Humifortis Blog</title>
        <link>https://humifortis.com/blog</link>
        <description>Humifortis Blog</description>
        <lastBuildDate>Thu, 09 Jul 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[Adding Humifortis to Keycloak: Step-by-Step Integration]]></title>
            <link>https://humifortis.com/blog/add-humifortis-to-keycloak</link>
            <guid>https://humifortis.com/blog/add-humifortis-to-keycloak</guid>
            <pubDate>Thu, 09 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A step-by-step guide to installing the Humifortis connector into an existing Keycloak instance and activating risk-based authentication.]]></description>
            <content:encoded><![CDATA[<p>This guide walks through adding Humifortis adaptive authentication to an existing Keycloak installation. By the end, every login through your realm will be evaluated for risk and challenged or blocked automatically when the score warrants it.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisites">Prerequisites<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#prerequisites" class="hash-link" aria-label="Direct link to Prerequisites" title="Direct link to Prerequisites" translate="no">​</a></h2>
<ul>
<li class="">Keycloak 21+ running (self-hosted or containerized)</li>
<li class="">Humifortis engine running and reachable from Keycloak (see <a class="" href="https://humifortis.com/docs/self-hosted">Self-Hosted Deployment</a>)</li>
<li class="">An API key from the Humifortis dashboard — <strong>Apps &amp; Keys → New App</strong></li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-1--download-the-connector-jar">Step 1 — Download the Connector JAR<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-1--download-the-connector-jar" class="hash-link" aria-label="Direct link to Step 1 — Download the Connector JAR" title="Direct link to Step 1 — Download the Connector JAR" translate="no">​</a></h2>
<p>Download the latest <code>humifortis-keycloak-connector.jar</code> from the <a href="https://github.com/humifortis/humifortis-keycloak-connector/releases/latest" target="_blank" rel="noopener noreferrer" class="">GitHub releases page</a>.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-2--install-the-jar">Step 2 — Install the JAR<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-2--install-the-jar" class="hash-link" aria-label="Direct link to Step 2 — Install the JAR" title="Direct link to Step 2 — Install the JAR" translate="no">​</a></h2>
<p>Place the JAR in Keycloak's providers directory so Keycloak picks it up on the next restart.</p>
<p><strong>Bare-metal:</strong></p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token function" style="color:rgb(220, 220, 170)">cp</span><span class="token plain"> humifortis-keycloak-connector.jar /opt/keycloak/providers/</span><br></span></code></pre></div></div>
<p><strong>Docker / Docker Compose:</strong></p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token key atrule">keycloak</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">image</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> quay.io/keycloak/keycloak</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token number" style="color:rgb(181, 206, 168)">26.1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">volumes</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain"> ./humifortis</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">keycloak</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">connector.jar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">/opt/keycloak/providers/humifortis</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">keycloak</span><span class="token punctuation" style="color:rgb(212, 212, 212)">-</span><span class="token plain">connector.jar</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain">ro</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token key atrule">environment</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">HUMIFORTIS_API_KEY</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"your-api-key-here"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">HUMIFORTIS_API_URL</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"http://humifortis:8080/api/v1"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token key atrule">HUMIFORTIS_FALLBACK_ALLOW</span><span class="token punctuation" style="color:rgb(212, 212, 212)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"true"</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-3--set-the-environment-variables">Step 3 — Set the Environment Variables<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-3--set-the-environment-variables" class="hash-link" aria-label="Direct link to Step 3 — Set the Environment Variables" title="Direct link to Step 3 — Set the Environment Variables" translate="no">​</a></h2>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token assign-left variable" style="color:rgb(156, 220, 254)">HUMIFORTIS_API_KEY</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">your-api-key-here          </span><span class="token comment" style="color:rgb(106, 153, 85)"># required</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(156, 220, 254)">HUMIFORTIS_API_URL</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">https://demo.humifortis.com </span><span class="token comment" style="color:rgb(106, 153, 85)"># default; change for self-hosted</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(156, 220, 254)">HUMIFORTIS_TIMEOUT_MS</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token number" style="color:rgb(181, 206, 168)">5000</span><span class="token plain">                     </span><span class="token comment" style="color:rgb(106, 153, 85)"># optional, default 5000ms</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token assign-left variable" style="color:rgb(156, 220, 254)">HUMIFORTIS_FALLBACK_ALLOW</span><span class="token operator" style="color:rgb(212, 212, 212)">=</span><span class="token plain">true                 </span><span class="token comment" style="color:rgb(106, 153, 85)"># optional, fail-open by default</span><br></span></code></pre></div></div>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-4--restart-keycloak">Step 4 — Restart Keycloak<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-4--restart-keycloak" class="hash-link" aria-label="Direct link to Step 4 — Restart Keycloak" title="Direct link to Step 4 — Restart Keycloak" translate="no">​</a></h2>
<p>Keycloak must be restarted (or rebuilt) to load the new JAR.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Docker Compose</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">docker</span><span class="token plain"> compose restart keycloak</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Bare-metal</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">/opt/keycloak/bin/kc.sh build</span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">/opt/keycloak/bin/kc.sh start</span><br></span></code></pre></div></div>
<p>After restart, the Humifortis authenticators will appear in <strong>Authentication → Executions</strong> in the Keycloak admin console.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-5--configure-the-authentication-flow">Step 5 — Configure the Authentication Flow<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-5--configure-the-authentication-flow" class="hash-link" aria-label="Direct link to Step 5 — Configure the Authentication Flow" title="Direct link to Step 5 — Configure the Authentication Flow" translate="no">​</a></h2>
<ol>
<li class="">Go to <strong>Authentication</strong> in your realm</li>
<li class="">Duplicate the built-in <strong>browser</strong> flow (never modify the built-in directly)</li>
<li class="">In your copy, add these executions in order:</li>
</ol>
<table><thead><tr><th>Execution</th><th>Placement</th><th>Requirement</th></tr></thead><tbody><tr><td><strong>HumifortisDeviceCollector</strong></td><td>After password form, before risk eval</td><td>REQUIRED</td></tr><tr><td><strong>HumifortisRiskAuthenticator</strong></td><td>After credentials</td><td>REQUIRED</td></tr><tr><td><strong>Conditional sub-flow</strong></td><td>After HumifortisRiskAuthenticator</td><td>CONDITIONAL</td></tr><tr><td>→ <strong>HumifortisHighCondition</strong> (condition)</td><td>Inside sub-flow</td><td>REQUIRED</td></tr><tr><td>→ <strong>HumifortisStepUpRouter</strong> (execution)</td><td>Inside sub-flow</td><td>REQUIRED</td></tr></tbody></table>
<ol start="4">
<li class="">Bind your new flow to the <strong>Browser Flow</strong> binding for the realm</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-6--add-the-event-listener">Step 6 — Add the Event Listener<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-6--add-the-event-listener" class="hash-link" aria-label="Direct link to Step 6 — Add the Event Listener" title="Direct link to Step 6 — Add the Event Listener" translate="no">​</a></h2>
<p>The event listener captures background events (logout, password change, MFA updates) and sends them asynchronously to Humifortis for risk scoring.</p>
<ol>
<li class="">Go to <strong>Events → Config</strong> in your realm</li>
<li class="">Under <strong>Event listeners</strong>, add <code>humifortis</code></li>
<li class="">Save</li>
</ol>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="step-7--test-it">Step 7 — Test It<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#step-7--test-it" class="hash-link" aria-label="Direct link to Step 7 — Test It" title="Direct link to Step 7 — Test It" translate="no">​</a></h2>
<p>Trigger a test login. In the Humifortis dashboard under <strong>Entities</strong>, find your test user — you should see a new event and an updated risk score.</p>
<p>To simulate a risk escalation without real traffic, use the API directly:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#9CDCFE;--prism-background-color:#1E1E1E"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#9CDCFE;background-color:#1E1E1E"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#9CDCFE"><span class="token comment" style="color:rgb(106, 153, 85)"># Send a few failed logins for a test user</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:rgb(156, 220, 254)">i</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">{</span><span class="token number" style="color:rgb(181, 206, 168)">1</span><span class="token punctuation" style="color:rgb(212, 212, 212)">..</span><span class="token number" style="color:rgb(181, 206, 168)">6</span><span class="token punctuation" style="color:rgb(212, 212, 212)">}</span><span class="token punctuation" style="color:rgb(212, 212, 212)">;</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(86, 156, 214)">do</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token function" style="color:rgb(220, 220, 170)">curl</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-s</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-X</span><span class="token plain"> POST https://your-humifortis-instance/api/v1/events </span><span class="token punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"X-API-Key: your-api-key"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"Content-Type: application/json"</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">    </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-d</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"{</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">event</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:{</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">event_id</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">test-</span><span class="token string variable" style="color:rgb(156, 220, 254)">$i</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">,</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">entity_id</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">user:keycloak:myrealm:test-user-id</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">,</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">entity_type</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">user</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">,</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">event_type</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">auth.login.failed</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">,</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">timestamp</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string variable" style="color:rgb(156, 220, 254)">$(</span><span class="token string variable function" style="color:rgb(220, 220, 170)">date</span><span class="token string variable" style="color:rgb(156, 220, 254)"> </span><span class="token string variable parameter variable" style="color:rgb(156, 220, 254)">-u</span><span class="token string variable" style="color:rgb(156, 220, 254)"> +%Y-%m-%dT%H:%M:%SZ</span><span class="token string variable" style="color:rgb(156, 220, 254)">)</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">,</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">metadata</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:{</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">ip_address</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">:</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">203.0.113.42</span><span class="token string entity" style="color:rgb(206, 145, 120)">\"</span><span class="token string" style="color:rgb(206, 145, 120)">}}}"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token keyword" style="color:rgb(86, 156, 214)">done</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token comment" style="color:rgb(106, 153, 85)"># Query the risk score</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain"></span><span class="token function" style="color:rgb(220, 220, 170)">curl</span><span class="token plain"> https://your-humifortis-instance/api/v1/risk/user:keycloak:myrealm:test-user-id </span><span class="token punctuation" style="color:rgb(212, 212, 212)">\</span><span class="token plain"></span><br></span><span class="token-line" style="color:#9CDCFE"><span class="token plain">  </span><span class="token parameter variable" style="color:rgb(156, 220, 254)">-H</span><span class="token plain"> </span><span class="token string" style="color:rgb(206, 145, 120)">"X-API-Key: your-api-key"</span><br></span></code></pre></div></div>
<p>On the next login from that user, the connector will call <code>POST /evaluate</code>, receive <code>CHALLENGE_MFA</code> (or <code>BLOCK</code> if the score is CRITICAL), and enforce accordingly.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-happens-at-login">What Happens at Login<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#what-happens-at-login" class="hash-link" aria-label="Direct link to What Happens at Login" title="Direct link to What Happens at Login" translate="no">​</a></h2>
<p>Once installed, every login through the flow goes through:</p>
<ol>
<li class=""><strong>HumifortisDeviceCollector</strong> — silently gathers 40+ device signals in the background</li>
<li class=""><strong>HumifortisRiskAuthenticator</strong> — sends the full login context to <code>POST /evaluate</code>, receives <code>ALLOW</code>, <code>CHALLENGE_MFA</code>, or <code>BLOCK</code></li>
<li class="">If <code>CHALLENGE_MFA</code> — <strong>HumifortisHighCondition</strong> triggers <strong>HumifortisStepUpRouter</strong>, which selects the best available MFA method and challenges the user</li>
<li class="">The <strong>event listener</strong> records the outcome and sends it back to the engine for the next evaluation</li>
</ol>
<p>That's it. No changes to your applications, no new login pages, no user-visible friction unless the risk score warrants it.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="next-steps">Next Steps<a href="https://humifortis.com/blog/add-humifortis-to-keycloak#next-steps" class="hash-link" aria-label="Direct link to Next Steps" title="Direct link to Next Steps" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://humifortis.com/docs/integration/keycloak">Full Keycloak connector reference</a> — all configuration options</li>
<li class=""><a class="" href="https://humifortis.com/docs/api">API Reference</a> — query risk scores and send events directly</li>
<li class=""><a class="" href="https://humifortis.com/docs/self-hosted">Self-Hosted Deployment</a> — run the engine on your own infrastructure</li>
</ul>]]></content:encoded>
            <category>keycloak</category>
            <category>integration</category>
            <category>adaptive-authentication</category>
            <category>tutorial</category>
        </item>
    </channel>
</rss>