1

我有一个 Keycloak 设置,并且正在使用 client_credential 流为数千个后端创建访问令牌。

我想在访问令牌中包含另一个自定义字段,所以在exp等旁边,我想有一个 field publicKey。该字段对于每个客户端都是特定且唯一的。

使用Keycloak可以吗?

编辑:澄清我有很多后端,每个后端都有一个特定和独特的publicKey

4

1 回答 1

1

我假设您在 claim 中有一个硬编码的值publicKey。如果是这样,这就足够了:您创建一个发布令牌的自定义范围。因此,假设您有一个 Client Backend,它希望将用户令牌交换为 serviceaccount-token 以联系下游服务client_credentials_service,并且此 serviceaccount-token 应该具有publicKey内部属性,这是您可以做到的一种方法:

  1. 在您的领域中,Client Scopes在管理 UI 下创建并保存一个新的 Scope。 客户端范围示例

  2. 转到Client Scopes -> publicKeyScope -> Mappers -> create并创建一个新的硬编码声明,示例如下: 硬编码映射器示例

  3. 打开您的客户端client_credentials_service并切换到选项卡Client Scopes 客户端示例

在这里,您可以将新范围作为默认范围或可选范围添加到客户端。可选意味着,在您向 kcs 令牌端点发出的请求以通过 client_credentials 流获取令牌时,您必须添加 scope=publicKeyScope 参数。例如像这样:

curl --location --request POST 'http://localhost:8080/auth/realms/yourRealm/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=client_credentials_service' \
--data-urlencode 'client_secret=your-secret' \
--data-urlencode 'scope=email publicKeyScope' \
--data-urlencode 'grant_type=client_credentials'

当它被添加为默认值时,您不必显式地将所需的范围添加到请求中。

只要您不将此范围(或相应的映射)添加到另一个客户端,只有通过客户端凭据流获得的 client_credentials_service 令牌才会包含此声明。

结果令牌的示例:令牌结果示例

于 2021-05-22T13:57:59.127 回答