如何通过Terraform配置Keycloak 18的Javascript OpenID Connect协议映射器
解决Keycloak 18 + Terraform Provider 3.9.1配置JavaScript OIDC协议映射器到客户端范围的问题
核心解决方案是使用keycloak_generic_protocol_mapper资源,该资源完全支持关联客户端范围及配置令牌类型,只是需要明确对应Keycloak API的参数映射,以下是具体实现步骤:
关键配置要点
- 通过
client_scope_id参数关联目标客户端范围(而非client_id,这是容易忽略的核心点) - 指定
protocol = "openid-connect"和protocol_mapper = "oidc-javascript-protocol-mapper"(对应Keycloak内置的JavaScript OIDC映射器类型) - 在
config块中配置管理UI里的所有对应字段:令牌声明名称、JSON类型、多值、令牌类型开关等
完整Terraform代码示例
# 先获取目标客户端范围(如profile)的ID,避免硬编码 data "keycloak_openid_client_scope" "profile" { realm_id = "your-realm-id" name = "profile" } # 创建JavaScript OIDC协议映射器并关联到profile客户端范围 resource "keycloak_generic_protocol_mapper" "custom_js_claim_mapper" { realm_id = "your-realm-id" client_scope_id = data.keycloak_openid_client_scope.profile.id name = "custom-fullname-claim" protocol = "openid-connect" protocol_mapper = "oidc-javascript-protocol-mapper" config = { # 对应UI中的"令牌声明名称" "claim.name" = "full_name" # 对应UI中的"声明JSON类型" "jsonType.label" = "String" # 对应UI中的"多值" "multivalued" = "false" # 对应UI中的"添加至ID令牌" "id.token.claim" = "true" # 对应UI中的"添加至访问令牌" "access.token.claim" = "true" # 对应UI中的"添加至userinfo" "userinfo.token.claim" = "true" # 自定义JavaScript映射逻辑 "script" = <<EOF function map(user, realm, client, session) { return user.firstName ? `${user.firstName} ${user.lastName}` : user.lastName; } EOF } }
注意事项
protocol_mapper的值必须为oidc-javascript-protocol-mapper,这是Keycloak 18内置JavaScript映射器的官方类型标识config块中的布尔参数需用字符串形式的"true"/"false"传递,符合Keycloak API的参数要求- 若脚本已预加载到Docker镜像中,也可通过
script.file参数指定镜像内的脚本路径,替代内联脚本
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

