如何通过 REST API 为 Keycloak 中的每个用户属性创建映射器?

Sat*_*ian 4 keycloak keycloak-services keycloak-rest-api

如何通过 Keycloak 的 REST API 创建具有以下值(如附图所示)的协议映射器?我在文档中找不到它 - 我确实找到了这个:Protocol Mapper - 但ProtocolMapperRepresentation接受一个 Map 和几个字符串。当我看到 UI 时,我看到了更多字段,并且不确定我是否正在查看正确的 API。

这是用户界面:

在此输入图像描述

我如何通过 API 做到这一点?

dre*_*ash 6

更新:从Keycloak 17 Quarkus 发行版/auth开始,该路径已被删除。因此,您可能需要从该答案中显示的端点调用中删除 。/auth

\n
\n
\n

如何通过 Keycloak 的 REST API 创建具有以下值(如附图所示)的协议映射器?

\n
\n

您可以通过调用以下端点来完成此操作:

\n
POST ${KEYCLOAK_HOST}/auth/admin/realms/${REALM_NAME}/clients/${ID of the Client}/protocol-mappers/models\n
Run Code Online (Sandbox Code Playgroud)\n

具有以下数据:

\n
{"protocol":"openid-connect","config":{"id.token.claim":"true","access.token.claim":"true","userinfo.token.claim":"true","multivalued":"","aggregate.attrs":"","user.attribute":"some-attribute","claim.name":"some-attribute","jsonType.label":"String"},"name":"some-attribute","protocolMapper":"oidc-usermodel-attribute-mapper"}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

我确实找到了这个:Protocol Mapper - 但\nProtocolMapperRepresentation 接受一个映射和几个字符串。\n当我看到 UI 时 - 我看到了更多字段,并且我\n不确定我是否在看\n正确的 API。

\n
\n

这是设计使然;使端点足够抽象以接受不同类型的协议映射器。该映射基本上编码了配置部分,该部分往往会随着映射器的不同而变化。

\n
\n

一步步

\n

您可以使用Keycloak Admin REST API获取该信息;要调用该 API,您需要具有适当权限的用户提供的访问令牌。现在,我将使用admin领域中的用户master,但稍后我将解释如何使用另一个用户:

\n
POST ${KEYCLOAK_HOST}/auth/admin/realms/${REALM_NAME}/clients/${ID of the Client}/protocol-mappers/models\n
Run Code Online (Sandbox Code Playgroud)\n

您将收到带有管理员令牌的 JSON 响应。access_token从该响应中提取属性值。让我们将其保存在变量中$ACCESS_TOKEN以供以后参考。

\n

为您的领域创建协议映射器$REALM_NAME

\n
{"protocol":"openid-connect","config":{"id.token.claim":"true","access.token.claim":"true","userinfo.token.claim":"true","multivalued":"","aggregate.attrs":"","user.attribute":"some-attribute","claim.name":"some-attribute","jsonType.label":"String"},"name":"some-attribute","protocolMapper":"oidc-usermodel-attribute-mapper"}\n
Run Code Online (Sandbox Code Playgroud)\n

一个例子"${PROTOCOL_JSON_DATA}"

\n
\'{"protocol":"openid-connect","protocolMapper":"oidc-hardcoded-claim-mapper","name":"test","config":{"claim.name":"test","claim.value":"test","jsonType.label":"","id.token.claim":"true","access.token.claim":"true","access.tokenResponse.claim":"false","userinfo.token.claim":"true"}}\'\n
Run Code Online (Sandbox Code Playgroud)\n

对于那些需要的人,我有用于上述步骤的脚本(这个这个)。

\n

分配适当的用户权限

\n

对于那些不想从主管理员用户获取访问令牌的人,您可以从其他用户获取访问令牌,但该用户需要客户端manage-clients的许可realm-management。为此,您可以:

\n

(旧的 Keycloak 用户界面)

\n
    \n
  • 转到“用户”,然后转到相关用户
  • \n
  • 转到选项卡Role Mappings
  • \n
  • client roles选择中realm-management
  • \n
  • 选择角色manage-clients并点击Add selected
  • \n
\n

(新的Keycloak UI)

\n
    \n
  • 转到“用户”,然后转到相关用户
  • \n
  • 转到选项卡Role Mappings
  • \n
  • 点击Assign role
  • \n
  • Search by role name类型中manage-clients
  • \n
  • 选择角色并分配它
  • \n
\n