我们开始使用keycloak 3.4.3,我们需要在我们的应用程序中引入一个模拟函数。我们发现keycloak有一个模仿api,不幸的是它没有为用户返回一个令牌,而是一个重定向链接,用户可以选择"他自己的客户。
我们在这里找到了
https://blog.softwaremill.com/who-am-i-keycloak-impersonation-api-bfe7acaf051a
一种(在scala中)检索新令牌的方法(仅适用于keycloak 3.4 +):
$(USERPROFILE)\Documents
我尝试根据它创建一个curl命令:
private def exchangeToken(token: String, userId: String): Future[TokenResponse] = {
import io.circe.generic.auto._
sttp
.post(uri"${config.authServerUrl}/realms/${config.realm}/protocol/openid-connect/token")
.body(
"grant_type" -> "urn:ietf:params:oauth:grant-type:token-exchange",
"client_id" -> config.clientId,
"requested_subject" -> userId,
"subject_token" -> token
)
.response(asJson[TokenResponse])
.send()
.flatMap {
_.body match {
case Left(error) => Future.failed(new RuntimeException(error))
case Right(Left(circeError)) => Future.failed(circeError)
case Right(Right(tokenResponse)) => Future.successful(tokenResponse)
}
}
}
但我收到错误" invalid_client_credentials"。客户" admin_cli"将access_type设为" public"。我尝试将授权令牌添加为承载但仍然遇到相同的错误。
我错过了配置的内容吗?或者curl命令是否缺少某些参数?
感谢您的帮助
答案 0 :(得分:0)
我解决了这个问题,在curl命令admin_cli
而不是admin-cli
中这是一个简单的拼写错误。
由于
答案 1 :(得分:0)
希望现在回答还为时不晚。我们可以使用模拟者(超级管理员)的凭据获取模拟者(tony123)的访问令牌。以下是我遵循的步骤。
impersonation
位于 Users -> superadmin -> Role Mappings -> client roles -> Realm-management
curl --location --request POST 'http://localhost:8180/auth/realms/tenant/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=password' \
--data-urlencode 'username=superadmin' \
--data-urlencode 'password=<superadmin-password>' \
--data-urlencode 'client_id=<source-client-id>' \
--data-urlencode 'client_secret=<source-client-secret>'
curl --location --request POST 'http://localhost:8180/auth/realms/tenant/protocol/openid-connect/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=<source-client-id>' \
--data-urlencode 'client_secret=<source-client-secret>' \
--data-urlencode 'grant_type=urn:ietf:params:oauth:grant-type:token-exchange' \
--data-urlencode 'subject_token=<access token got in step one>' \
--data-urlencode 'requested_token_type=urn:ietf:params:oauth:token-type:access_token' \
--data-urlencode 'requested_subject=<user id of tony123>'