Skip to content

Keycloak

CaptchaLa 官方 Keycloak 插件。无需编写任何代码,即可为 Keycloak 内置的登录、注册和重置密码页面添加 CAPTCHA 验证,并在服务端完成校验。以单个 provider JAR 形式发布,直接放入 Keycloak 即可。

覆盖范围

以下每个流程均以独立认证步骤的形式接入 —— 您只需保护想要防护的页面即可。

  • 浏览器登录(用户名 / 密码表单)
  • 自助注册
  • 重置密码("忘记密码"页面)

验证码默认以浮动控件(float)形式渲染,也可配置为点击弹出的模态框(popup)。

安装

1. 获取 JAR 包

插件已开源,地址: github.com/Captcha-La/captchala-keycloak。两种方式:

  • 下载 release 包(推荐)—— 在仓库的 Releases 页面下载 keycloak-captchala-<version>.jar
  • 从源码构建 —— git clone 仓库后运行 mvn clean package,JAR 包会生成在 target/ 目录下。

插件要求 Keycloak ≥ 26(Quarkus 发行版)及 Java 17。

2. 部署插件

bash
cp keycloak-captchala-1.0.0.jar /opt/keycloak/providers/
/opt/keycloak/bin/kc.sh build
# 重启 Keycloak

然后设置登录主题:Realm 设置 → 主题 → 登录主题 → captchala

3. 获取密钥

dash.captcha.la 注册账号,创建一个应用,然后复制:

  • App Key —— 公钥,会嵌入到页面中
  • App Secret —— 仅在服务端使用,由 Keycloak 用于签发一次性 token 并调用 /v1/validate

4. 接入流程

在管理控制台中,将对应的执行步骤添加到您希望保护的每个流程,然后点击齿轮图标粘贴您的 App KeyApp Secret

  • 浏览器登录 —— 复制 browser 流程,将 Username Password Form 替换为 Captchala Username Password Form(REQUIRED),并将其绑定为 Realm 的浏览器流程。
  • 注册 —— 复制 registration 流程,在注册表单子流程中添加 Captchala Registration(REQUIRED),并将其绑定为 Realm 的注册流程。
  • 重置密码 —— 复制 reset credentials 流程,将 Choose User 替换为 Captchala Reset Credential (choose user)(REQUIRED),并将其绑定为 Realm 的重置凭据流程。

在隐私窗口中打开任意一个受保护的页面,确认验证码正常渲染。

配置项

每个执行步骤均通过各自的齿轮图标独立配置。只要密钥已填写,默认值即可开箱即用。

配置项Key默认值说明
App Keyapp.key来自 CaptchaLa 控制台的公钥。必填。
App Secretapp.secret服务端密钥。必填。以脱敏形式存储,不会暴露给浏览器。
API 基础 URLapi.basehttps://apiv1.captcha.laCaptchaLa API 基础地址。
控件脚本 URLscript.urlhttps://api.captcha.la/sdk/jslib/captchala.js控件 JS 的加载地址。
控件样式 URLcss.urlhttps://api.captcha.la/sdk/jslib/captchala.css控件 CSS 的加载地址。
渲染模式productfloatfloat(浮动控件)或 popup(模态框)。
Action 标签action按流程验证时上送的 action 值(loginregisterreset)。
语言languageRealm 语言控件语言;留空则跟随 Keycloak 的语言设置。
失败时拒绝fail.closedtrueCaptchaLa API 不可达时,拒绝本次提交。关闭则改为失败放行。
使用服务端 tokenuse.server.tokentrue渲染时由服务端签发一次性 token,提供更强的防重放保护。

常见问题

插件免费吗?

是的,Keycloak 插件免费且开源。CaptchaLa 免费额度为每月 10,000 次验证 —— 仅在需要更高用量时才会涉及付费计划。

支持哪些 Keycloak 版本?

Keycloak 26+ Quarkus 发行版,基于 26.5.6 与 Java 17 构建。将 JAR 放入 providers/ 目录,运行 kc.sh build 后重启即可。

可以保护哪些页面?

浏览器登录、自助注册和重置密码。每个页面独立接入各自的流程,可根据需要保护其中一个、两个或全部三个。

App Secret 会暴露给浏览器吗?

不会。密钥以脱敏形式存储,仅在 Keycloak 向 CaptchaLa API 发起请求时通过 X-App-Secret 请求头传输,不会出现在任何页面、模板或日志中。每次挑战均使用一次性 token 完成验证,因此已解过的 token 无法被重放。

CaptchaLa API 不可达时会怎样?

默认情况下插件会失败关闭(拒绝本次提交)。可在任意执行步骤上将 fail.closed 关闭,改为失败放行 —— 适合灰度上线,不建议在生产环境中使用。

源码

MIT-licensed examples · CaptchaLa is operated independently