KEYCLOAK自定义用户存储SPI下只读联邦用户OTP 2FA实现方案咨询
Keycloak只读联邦用户无本地缓存实现OTP双因素认证方案
以下是不需要将用户同步到Keycloak本地存储的可行实现方案:
方案1:自定义OTP认证执行器+外部存储OTP密钥
该方案完全不依赖Keycloak本地的用户存储写入能力,所有OTP相关数据落地到你已对接的SQL Server中:
- 第一步:扩展现有自定义用户存储的
UserAdapter实现,新增OTP相关属性映射:
新增otp_secret、otp_enabled、otp_algorithm、otp_digits、otp_period字段的读写逻辑,读取直接从SQL Server拉取,写入直接更新SQL Server对应记录,无需调用Keycloak本地存储的更新接口 - 第二步:自定义Authenticator SPI替换默认OTP认证逻辑:
继承AbstractOTPFormAuthenticator类,重写两个核心方法:getOtpCredential:不再从Keycloak默认的CredentialManager读取本地存储的OTP配置,改为直接从你扩展的UserAdapter中拉取SQL Server里存的OTP属性- OTP绑定逻辑:用户首次扫码绑定OTP时,生成的密钥直接写入SQL Server对应用户记录,不需要调用Keycloak的凭证存储接口写入本地
- 第三步:调整认证流配置
进入Keycloak对应Realm的「认证」页面,复制默认的浏览器认证流,将原有默认的「OTP表单」执行器替换为你自定义的OTP认证器,设置为必填后绑定到对应客户端或全局生效
方案2:无状态Cookie绑定方案(轻量场景适用)
如果不需要持久化保存用户的OTP配置,该方案完全不需要任何服务端写入操作:
- 自定义认证执行器在用户密码校验通过后,生成临时OTP密钥返回前端供用户扫码绑定,同时将AES加密后的OTP密钥写入客户端
HttpOnly类型Cookie,有效期和用户会话绑定 - 用户后续提交OTP校验码时,服务端直接从Cookie中解密获取密钥做校验,无需读写任何服务端存储
- 注意:该方案仅适合会话时长较短、安全要求中等的场景,Cookie需配置
Secure、HttpOnly、SameSite=Strict属性避免密钥泄露
注意事项
Keycloak 18+版本部署自定义Authenticator SPI时,需要在SPI包的
jboss-deployment-structure.xml中显式引入org.keycloak.keycloak-services依赖,否则会出现类找不到的报错
你可以直接重写自定义用户存储SPI的updateCredential方法,对接SQL Server的写入逻辑,该操作不会触发Keycloak本地的用户数据同步写入
内容的提问来源于stack exchange,提问作者RedArcCoder
相关产品推荐
相关产品推荐

