我的用户有一个
birthDate
属性:
我在客户端创建了一个映射器:
但是在访问令牌中看不到它:
{
"exp": 1646589516,
"iat": 1646589216,
"jti": "7cee1468-8d80-4f14-a118-b07477c1e1e7",
"iss": "http://localhost:8080/realms/...",
"aud": "account",
"sub": "f:fd2a5a5a-c7a0-4e74-81a8-916a85885f98:...",
"typ": "Bearer",
"azp": "...",
"session_state": "efce7a63-2a8f-438d-b4a1-f5d979a00c81",
"acr": "1",
"realm_access": {
"roles": [
"offline_access",
"uma_authorization"
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "openid profile email",
"sid": "efce7a63-2a8f-438d-b4a1-f5d979a00c81",
"email_verified": false,
"preferred_username": "..."
}
keycloak 会不会缓存在某个地方? (我清除了
Realm
--> Caches
处的缓存)
我很绝望......每个教程都这样做,但它对我不起作用。
更新:我可以在远程服务器上测试它并且它正在工作。钥匙斗篷到底在哪里缓存并搞砸了我?
---------------------------------------------------------------------------
更新2:删除了keycloak并重新安装,所以从0开始:
创建的领域:ep
在这里我们可以看到用户有一个属性
birthDate
,其值为my-custom-birth-date
:
我去
Clients
--> ep
客户端 --> Mappers
并创建一个像这样的映射器:
Clients
--> ep
--> Client Scopes
--> Evaluate
--> Evaluate
按钮我们可以看到 birthDate
可以在那里找到(最后一行,也是默认的 birthdate
)
可见):P...o
那么您可以看到访问令牌不包含 birthDate
属性:仍然缺少属性
birthDate
。
我重复了上面所做的每一个操作,并且在远程钥匙斗篷中可以看到该属性(图像上的最后一个):
---------------------------------------------------------------------------
所以我发现了问题:
这是我的 keycloak 文件夹及其路径:
我将
data
文件夹复制到此处,认为我不需要重新创建领域/客户端/等:
每当我重新安装 keycloak 时,我都会删除
keycloak-17.0.0
文件夹并重新安装到同一位置:
在我删除了
data
和 keycloak-17.0.0
并重新创建领域/客户端/映射器/等后,它工作正常......
不知道为什么 keycloak 检查树上方的配置/设置/缓存文件夹...
我也无法将用户属性添加到令牌中。 对我来说,解决方案是使用 keycloak 的
token exchange
功能。
更多信息 -> https://www.keycloak.org/securing-apps/token-exchange
为此,我必须执行以下操作:
kc.sh build --features="token-exchange"
/auth/realms/client-id/protocol/openid-connect/token
端点发出POST keycloak请求,并在有效负载中包含grant_type=password
。/auth/realms/client-id/protocol/openid-connect/token
和 grant_type=urn:ietf:params:oauth:grant-type:token-exchange
向 subject_token
端点发出新请求,其中包含先前请求的访问令牌。token exchange
解码令牌以能够查看用户属性。