使用 scriptMapper 计算 Keycloak 客户端属性

Compute Keycloak client attribute using scriptMapper

我正在使用 Keycloak 作为 Open ID 连接提供商, 我想通过 OpenId 将我的 keycloak 实例连接到服务。 但是此服务需要用户信息来提供数字标识符(keycloak 不提供)。 我想我可以使用脚本映射器来完成该任务并获取密钥斗篷内部 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 6.0.1 上检查过了。 但是,您应该检查并考虑一些事项:

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

  2. 确保您已启用 "Add to userinfo",如下图所示:

Note: For the sake of tests, you can also enable 'Add to access token'. In that case you can just request access token using resource owner password credentials grant and check if mapper works as intended.

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

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 的唯一性,那么您应该重新考虑您的方法。当然,可以显式设置用户的属性,但这需要手动管理,因此它可能不是一个选项。