【问题标题】:Compute Keycloak client attribute using scriptMapper使用 scriptMapper 计算 Keycloak 客户端属性
【发布时间】:2019-10-14 18:24:48
【问题描述】:

我使用 Keycloak 作为 Open ID 连接提供程序, 我想通过 OpenId 将我的 keycloak 实例连接到服务。 但是此服务需要用户信息来提供数字标识符(keycloak 不提供)。 我想我可以使用脚本映射器来完成该任务,并获取关键的 cloak 内部 id(一个 uuid)并从中生成一个数字 id。

脚本映射器应该接受 javascript,但没有文档或 Playground 可以帮助我调试结果。

这段代码似乎可以工作,但我无法在我的用户信息中获得结果。

var id = user.Id.replace(/-/g, '').substring(0,10);
var fake_id = parseInt(id, 16);
fake_id

此代码已被接受,但我无法调试它。 当我尝试return fake_id; 时出现错误: Invalid return statement return fake_id;

感谢您的帮助!

【问题讨论】:

    标签: keycloak jboss-tools


    【解决方案1】:

    您的代码几乎是好的。我已经在 Keycloak 6.0.1 上检查过了。 但是,您应该检查并考虑以下几点:

    1. JS 脚本不应明确包含任何return 语句。它的最后一条语句被作为返回值。在 Keylcoak 6.0.1 上添加显式返回会导致验证错误。

    2. 确保您已启用“添加到用户信息”,如下图所示:

    注意:为了测试,您还可以启用“添加到访问令牌”。在这种情况下,您只需使用资源所有者密码凭据授予请求访问令牌并检查映射器是否按预期工作。

    1. 您的 JS 代码中有几处需要更改:
      • 在基于 10 个字符解析 int 时,生成的数字太大而无法解析为 int。当我喜欢这个到 6 个字符时,我得到了一个 int
      • 对结果数字使用 Math.floor() 以确保它是一个 int。这很奇怪,但我发现即使是简单的parseInt("10") 也会导致Double 不是Integer。我相信这是 Nashorn(Keycloak 使用的 Javascript 引擎)的特性

    var id = user.id.replace(/-/g, '').substring(0,6);
    var fake_id = parseInt(id, 16);
    Math.floor(fake_id);

    添加映射器后,在auth/realms/example/protocol/openid-connect/token 端点上请求时,我得到了诸如14401067 之类的ID(我使用Insomnia 进行请求,它对Auth 有很好的支持,因此您可以直接请求/userinfo 端点如果你想要 - Insomnia 将首先处理请求访问令牌)。

    编写这样的映射器会得到一个基于 UUID 的整数。然而,仔细考虑后,这不是一个理想的方法——它并不能真正保证你的独特性。这是因为我们将 128 位值的 UUID 缩短为 int。因此,可能会发生冲突。如果您的系统强烈依赖此 id 的唯一性,那么您应该重新考虑您的方法。当然,可以显式设置用户的属性,但这需要手动管理,因此可能不是一个选项。

    【讨论】:

    • 更新:实际上是 Math.floor(fake_id);不适用于最新的 keycloak 版本。我根本没有得到任何输出,keycloak 返回此错误:无法为令牌声明映射类型。我将在 keycloak 错误跟踪器上填写错误报告。
    猜你喜欢
    • 2021-10-27
    • 2019-10-26
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    • 2021-01-01
    • 2022-11-14
    • 1970-01-01
    相关资源
    最近更新 更多