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

Keycloak 如何更改通过KeyClope令牌交换创建的访问令牌的内容,keycloak,token-exchange,Keycloak,Token Exchange,我的目标是获得两个特定于资源服务器的访问令牌,它们只包含特定于相应资源服务器的数据 我有以下设置:一个公共客户端使用2个资源服务器 配置客户机、用户、领域角色、客户机范围后,通过使用scope参数,我能够创建2个不同的、特定于资源服务器的访问令牌: { "exp": 1603234566, "iat": 1603216566, "jti": "13ae00ac-ce57-43ce-8b47-39ad6d5445cd

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

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

配置客户机、用户、领域角色、客户机范围后,通过使用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"
}

在登录过程中,我将scope参数设置为client\u scope\u fitness\u resource\u server\u 1\u roles,并获取第一个特定于资源服务器1的访问令牌。由于我在登录过程中只获得一个访问令牌,并且我的客户机是公共的,因此我希望通过使用KeyClope的内部令牌到内部令牌令牌交换功能,使用资源服务器1获取第二个-资源服务器2特定的-访问令牌。我按照说明进行操作,我可以通过此呼叫获得第二个令牌:

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
我的问题是,如何配置keydape,使第二个访问令牌不包含角色“脱机访问”和“uma授权”以及aud:“其他资源服务器”、“健身客户端”、“其他客户端”、“帐户”?

我找到了解决方案:-)

我必须将资源服务器2设置-访问类型配置从仅承载更改为机密,禁用所有流/授权,通过此更改,我也可以在资源服务器2中配置客户端范围和范围

即使我不需要机密信息(流/授权、凭证等),我也不得不从仅持票人更改为机密信息,这并不好,但这使得更改访问令牌输出成为可能

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"
}