Keycloak:在主题声明上映射用户名

Nic*_*Ben 3 keycloak

我需要配置 Keycloak,以便它创建一个 JWT,声明“sub”填充了用户名,而不是 sub 中的默认 userId。

这意味着,而不是这个令牌:

{
    "jti": "b1384883-9b59-4788-b09f-98b40b7e3c3b",
   ...
    "sub": "fbdb4e4a-6e93-4b08-a1e7-0b7bd08520a6",
    "preferred_username": "m123456"
}
Run Code Online (Sandbox Code Playgroud)

我需要收到:

 {
    "jti": "b1384883-9b59-4788-b09f-98b40b7e3c3b",
    ...
    "sub": "m123456",
    "preferred_username": "m123456"
 }
Run Code Online (Sandbox Code Playgroud)

你能建议怎么做吗?

我尝试过用户名映射器,但它添加了第二个“子”声明,并且 jwt 无效。

小智 15

或者这样:使用用户属性映射器类型。

将用户属性映射到声明

    {
      "id": "5d45fe41-83c6-4457-807b-5240ff7c09b9",
      "name": "UsernameInSubject",
      "protocol": "openid-connect",
      "protocolMapper": "oidc-usermodel-property-mapper",
      "consentRequired": false,
      "config": {
        "userinfo.token.claim": "true",
        "user.attribute": "username",
        "id.token.claim": "true",
        "access.token.claim": "true",
        "claim.name": "sub",
        "jsonType.label": "String"
      }
Run Code Online (Sandbox Code Playgroud)

  • 这会创建重复的“子”声明。有些图书馆不喜欢这样。 (2认同)

Nic*_*Ben 5

我是这样解决的。

1)在“客户端”配置部分选择您的客户端

2)转到“映射器”选项卡并创建一个新的“脚本映射器”

3) 一个名为“脚本”的可编辑部分将打开,您可以在其中编辑以下行: token.setSubject(user.getUsername());

4)现在我的令牌包含 "sub": "user123456"

5)看看这张图片

在此处输入图片说明

  • 脚本映射器不再可用 (2认同)