如何更改通过 Keycloak 令牌交换创建的访问令牌的内容

Posted

技术标签:

【中文标题】如何更改通过 Keycloak 令牌交换创建的访问令牌的内容【英文标题】:How to change the content of access tokens created through Keycloak token exchange 【发布时间】:2021-02-03 15:14:53 【问题描述】:

我的目标是获得两个资源服务器特定的访问令牌,其中仅包含特定于相应资源服务器的数据。

我有以下设置:一个公共客户端正在使用 2 个资源服务器。

配置 clientsusersrealm rolesclient scopes 并使用 scope 参数,我可以创建 2 个不同的资源服务器特定的访问令牌:


  "exp": 1603234566,
  "iat": 1603216566,
  "jti": "13ae00ac-ce57-43ce-8b47-39ad6d5445cd",
  "iss": "http://localhost:8080/auth/realms/fitness-realm",
  "aud": "fitness-resource-server-1",
  "sub": "de1f0820-f4d9-49be-a6d1-c8faef083ffc",
  "typ": "Bearer",
  "azp": "fitness-client",
  "session_state": "47ea42f9-42ac-452e-9e54-be6d705e9a61",
  "acr": "1",
  "realm_access": 
    "roles": [
      "fitness_user"
    ]
  ,
  "scope": "openid email profile client_scope_fitness_resource_server_1_roles",
  "email_verified": false,
  "preferred_username": "bill"


  "exp": 1603235280,
  "iat": 1603217280,
  "jti": "fb75a956-6ed4-4edd-8e20-2cd9678d4869",
  "iss": "http://localhost:8080/auth/realms/fitness-realm",
  "aud": "fitness-resource-server-2",
  "sub": "de1f0820-f4d9-49be-a6d1-c8faef083ffc",
  "typ": "Bearer",
  "azp": "fitness-client",
  "session_state": "966aa651-0534-43d4-9413-a8c141ee8549",
  "acr": "1",
  "realm_access": 
    "roles": [
      "fitness_user"
    ]
  ,
  "scope": "openid email profile client_scope_fitness_resource_server_2_roles",
  "email_verified": false,
  "preferred_username": "bill"

在登录过程中,我将 scope 参数设置为 client_scope_fitness_resource_server_1_roles 并获取第一个资源服务器 1 特定的访问令牌。由于我在登录过程中只获得一个访问令牌并且我的客户端是公共的,因此我想使用资源服务器 1 来获取第二个 - 资源服务器 2 特定的 - 访问令牌,方法是使用 Keycloak 的内部令牌到内部令牌 令牌交换 功能。我按照说明进行操作,并且可以通过此调用获得第二个令牌:

curl -X POST http://localhost:8080/auth/realms/fitness-realm/protocol/openid-connect/token \
    -d "client_id=fitness-resource-server-1” \
    -d "client_secret=<my_secret>" \
    -d "grant_type=urn:ietf:params:oauth:grant-type:token-exchange" \ 
    -d "subject_token=$FIRST_ACCESS_TOKEN" \
    -d "requested_token_type=urn:ietf:params:oauth:token-type:refresh_token" \
    -d "audience=fitness-resource-server-2" |jq

但如果我查看第二个标记的内部,它包含我想要的更多信息:


  "exp": 1603234572,
  "iat": 1603216572,
  "jti": "4f4b0fb6-d759-4c6a-b35d-7e2a998b5a20",
  "iss": "http://localhost:8080/auth/realms/fitness-realm",
  "aud": [
    "other_resource_server",
    "fitness-client",
    "other_client",
    "account",
    "fitness-resource-server-2"
  ],
  "sub": "de1f0820-f4d9-49be-a6d1-c8faef083ffc",
  "typ": "Bearer",
  "azp": "fitness-resource-server-1",
  "session_state": "47ea42f9-42ac-452e-9e54-be6d705e9a61",
  "acr": "1",
  "realm_access": 
    "roles": [
      "fitness_user",
      "offline_access",
      "uma_authorization"
    ]
  ,
  "scope": "email profile",
  "email_verified": false,
  "preferred_username": "bill"

我的问题是,如何配置 Keycloak 以使第二个访问令牌不包含角色“offline_access”和“uma_authorization”以及 aud:“other_resource_server”、“fitness-client”、“other_client”、“account” ?

【问题讨论】:

【参考方案1】:

我找到了解决方案:-)

我必须将资源服务器 2 settings - 访问类型 配置从 bearer only 更改为 confidential,禁用所有流/授权,通过此更改,我也可以在资源服务器 2 中配置 Client ScopeScope

即使我不需要机密(流/授权、凭据等),但这使得更改访问令牌输出成为可能。

【讨论】:

以上是关于如何更改通过 Keycloak 令牌交换创建的访问令牌的内容的主要内容,如果未能解决你的问题,请参考以下文章

通过访问或 id 令牌/令牌交换建立 SSO/设置 cookie

Keycloak:为错误的客户模拟铸造令牌

Keycloak:访问令牌验证端点

KEYCLOAK:仅通过“用户名”获取访问令牌(无密码)

Keycloak 访问令牌与 UserInfo 令牌?

Keycloak :REST API 调用通过管理员用户名和密码获取用户的访问令牌