Keycloak:身份提供商登录时获取邮箱并验证域名且不创建新账户
限制Keycloak中Google身份提供商的托管域名访问
我之前刚好处理过类似的需求——要让Keycloak的Google身份提供商只允许特定托管域名的用户登录,而不是随便哪个Google账户都能访问。下面是完整的实现方案,包括脚本代码和配置步骤:
1. 编写托管域名验证脚本
直接用Keycloak的认证脚本功能,在first broker login流程里插入验证逻辑,尽早拦截不符合要求的用户。完整脚本如下:
AuthenticationFlowError = Java.type("org.keycloak.authentication.AuthenticationFlowError"); function authenticate(context) { // 获取当前用户的身份提供商数据(来自Google) var user = context.getUser(); var attributes = user.getAttributes(); // 定义你允许的托管域名,替换成你的实际域名 var allowedDomain = "your-company.com"; // 方式1:直接读取Google返回的`hd`字段(推荐,官方托管域名标识更可靠) var hostedDomain = attributes.getFirst("hd"); if (!hostedDomain || hostedDomain !== allowedDomain) { // 域名不匹配,抛出错误终止流程 context.failure(AuthenticationFlowError.INVALID_USER, context.form().setError("invalid-domain", allowedDomain).createForm("error.ftl")); return false; } // 方式2:如果hd字段不存在,解析邮箱域名作为备选方案 // var email = user.getEmail(); // if (!email || !email.endsWith("@" + allowedDomain)) { // context.failure(AuthenticationFlowError.INVALID_USER, // context.form().setError("invalid-domain", allowedDomain).createForm("error.ftl")); // return false; // } // 验证通过,继续后续认证流程 return true; }
脚本关键说明
- 优先用方式1:Google OAuth返回的
hd字段是官方的托管域名标识,比解析邮箱更准确,能避免用户邮箱别名等特殊情况的误判 - 把
your-company.com替换成你实际要限制的托管域名 - 验证不通过时,会触发Keycloak的错误页面,明确提示用户域名不符合要求
2. 在Keycloak中配置脚本流程
默认的first broker login流程不建议直接修改,最好复制一个新流程来定制:
- 登录Keycloak管理控制台,进入你的目标Realm
- 切换到Authentication -> Flows标签页
- 找到
first broker login流程,点击右侧的Actions -> Copy,给新流程起个辨识度高的名字(比如first-broker-login-restricted) - 在新流程里,找到Review Profile步骤,点击它上方的Add execution,选择Script Execution后点击Save
- 把新添加的Script Execution步骤拖到Review Profile的前面(确保验证逻辑在用户创建/资料更新之前执行)
- 点击这个脚本步骤的Actions -> Config,把上面的脚本粘贴进去,设置Script Type为
Authentication Script,保存配置 - 最后,转到Identity Providers -> 你的Google身份提供商,在Authentication Flow Overrides区域,把First Broker Login Flow设置为你刚才创建的
first-broker-login-restricted流程,保存即可
这样配置完成后,任何非指定托管域名的Google账户在登录时都会被直接拦截,无法进入后续的用户创建或资料审核环节。
内容的提问来源于stack exchange,提问作者Robbie Blaine
相关产品推荐
相关产品推荐

