基于Keycloak的WebAuthn场景下OIDC流程选择及配置问询
问题解答
1. 移动应用适合的OIDC流程
你提到“移动应用无法使用授权码流程”是个误解——**授权码流程+PKCE(Proof Key for Code Exchange)**才是OAuth 2.0/OIDC针对移动应用的标准推荐流程,完全替代不安全的隐式流程。
至于WebView录入指纹体验差的问题,根本原因是不该用WebView处理认证。正确做法是使用AppAuth这类库,调用系统自带的浏览器组件(比如Android的Chrome Custom Tabs、iOS的Safari View Controller)完成OIDC认证流程。这种方式下,WebAuthn(Passkey)会直接唤起系统原生的生物识别弹窗(指纹、面容ID等),体验和系统级应用一致,远优于WebView内的弹窗。
2. Keycloak配置Passkey优先、用户名密码回退的认证规则
要实现“已注册Passkey则优先使用,否则回退用户名密码”的逻辑,需自定义Keycloak认证流并绑定到客户端:
步骤1:启用WebAuthn认证器
在Keycloak后台的「领域设置」→「认证」→「认证器」中,确保webauthn-passwordless(Passkey属于无密码WebAuthn类型)已启用。
步骤2:创建自定义认证流
- 进入「领域设置」→「认证」→「流程」,复制默认的「浏览器」认证流,命名为
Passkey-First Browser Flow。 - 编辑这个新流程:
- 将原有的「用户名密码表单」执行步骤移至下方。
- 添加新执行步骤:选择
webauthn-passwordless认证器,设置为「条件执行」。 - 点击该WebAuthn步骤的「配置」,在「执行条件」中添加判断逻辑:检查用户是否已注册Passkey凭证,用Keycloak表达式语言实现:
user.getCredentials().stream().anyMatch(c -> c.getType().equals("webauthn-passwordless")) - 将WebAuthn步骤的「要求」设为「可选」,这样当条件不满足(用户无Passkey)时,会自动执行下一个步骤。
- 确保下方的「用户名密码表单」步骤设置为「必需」。
步骤3:绑定到客户端
打开移动应用对应的Keycloak客户端,在「认证流程覆盖」中,将「浏览器流程」设置为刚才创建的Passkey-First Browser Flow,保存配置即可。
配置完成后,用户访问认证页面时:
- 已注册Passkey的用户会直接触发WebAuthn生物识别认证;
- 未注册Passkey的用户会自动跳转至传统用户名密码登录界面。
内容的提问来源于stack exchange,提问作者arnabkaycee
相关产品推荐
相关产品推荐

