如何在 Keycloak 中创建脚本映射器?

Posted

技术标签:

【中文标题】如何在 Keycloak 中创建脚本映射器?【英文标题】:How to create a Script Mapper in Keycloak? 【发布时间】:2019-03-02 06:22:08 【问题描述】:

我需要在 Keycloak 中创建一个脚本映射器类型的协议映射器。该脚本应该获取用户属性,检查其大小,并将其放在令牌上。我没有找到有关如何创建脚本的文档或示例。从我能收集到的点点滴滴,我想我的脚本需要看起来像:

var value = user.getAttribute("myAttribute");
if (value.length > LIMIT) 
    value = value.substring(0,LIMIT);

token.setOtherClaims("myAttribute",value);
是这样吗?我编造了 user.getAttribute("myAttribute")。是否有可以找到如何获取 Keycloak 用户属性的文档来源? 脚本是否需要返回任何内容? 欢迎任何帮助。

【问题讨论】:

【参考方案1】:

通过查看这里的 keycloak 源可以理解 Script Mappers 的魔力:Source

脚本可以像这样使用exports变量返回一些东西

exports = "Claim Value"

不同的类型:

用户:SourceJavaDoc 领域:SourceJavaDoc 令牌:SourceJavaDoc 用户会话:SourceJavaDoc keycloakSession: Source JavaDoc

这是一个示例脚本:

// you can set standard fields in token
token.setAcr("test value");

// you can set claims in the token
token.getOtherClaims().put("claimName", "claim value");

// multi-valued claim (thanks to @ErwinRooijakkers)
token.getOtherClaims().put('foo', Java.to(['bars'], "java.lang.String[]"))

// work with variables and return multivalued token value
var ArrayList = Java.type("java.util.ArrayList");
var roles = new ArrayList();
var client = keycloakSession.getContext().getClient();
var forEach = Array.prototype.forEach;
forEach.call(user.getClientRoleMappings(client).toArray(), function(roleModel) 
  roles.add(roleModel.getName());
);

exports = roles;

希望对你有帮助!

【讨论】:

您知道是否有一种方法可以从脚本映射器访问 HTTP 标头,以便您可以从标头中提取值以作为声明插入? 你的意思是这样的:***.com/questions/47233720/…? 这很简单。谢谢。 绝对漂亮,正是我想要的。 我正是这样做的(在 10.0.2 中),但我添加的映射器没有显示在 GUI 中。它应该在内置映射器下吗?【参考方案2】:

我需要这个功能,但在我新安装的 10.0.2 中找不到这个“脚本映射器”。原来默认情况下它没有启用,如这里的文档中所示:https://www.keycloak.org/docs/latest/server_installation/#profiles

要启用它,您可以:

使用feature.scripts=enabled 创建文件standalone/configuration/profile.properties

bin/standalone.sh|bat -Dkeycloak.profile.feature.scripts=enabled启动服务器

似乎来自the source code

public boolean isSupported() 
    return Profile.isFeatureEnabled(Profile.Feature.SCRIPTS) && Profile.isFeatureEnabled(Profile.Feature.UPLOAD_SCRIPTS);

upload_scripts 应该同样启用

希望对大家有所帮助

【讨论】:

感谢您的评论,我想它也找到了您的帖子:-)。文档说我们不应该在生产中启用脚本上传,但我们应该在服务器上部署脚本:keycloak.org/docs/latest/server_development/…

以上是关于如何在 Keycloak 中创建脚本映射器?的主要内容,如果未能解决你的问题,请参考以下文章

keycloak 客户端协议映射器(脚本映射器)将请求标头添加到令牌中

Keycloak 中的协议映射器如何工作?

keycloak 从自定义协议映射器抛出身份验证错误

keycloak - 使用 kcadm.sh 将协议映射器添加到 keycloak

Keycloak 使用自定义协议映射器从数据库/外部源添加额外声明

Keycloak 客户端映射器将领域名称显示为 JWT 令牌中的单个属性