如何在 KeyCloak 中的签名 JWT 中获取 client_assertion

Posted

技术标签:

【中文标题】如何在 KeyCloak 中的签名 JWT 中获取 client_assertion【英文标题】:How to get client_assertion in signed JWT in KeyCloak 【发布时间】:2020-09-05 16:07:08 【问题描述】:

我尝试使用签名的 JWT 登录,我按照这个例子,https://github.com/thomasdarimont/spring-boot-keycloak-jwe-example。

但是,当我尝试使用以下脚本通过 curl 获取令牌时

KC_USERNAME=root
KC_PASSWORD=casiopea
KC_CLIENT_ID=jweclient
KC_CLIENT_SECRET=418d630c-44cb-4f11-9dcc-a0c72dfc9f85
KC_ISSUER=http://localhost:8080/auth/realms/jwedemo

KC_RESPONSE=$(
curl
-d “client_id=$KC_CLIENT_ID”
-d “client_secret=$KC_CLIENT_SECRET”
-d “username=$KC_USERNAME”
-d “password=$KC_PASSWORD”
-d “client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer”
-d “grant_type=password”
-d “scope=profile openid”
-d “client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyZTJlOWU4NC04Y2UxLTQ5NWEtOGY5Zi1jMWNiNDNhYmY5NzQifQ.eyJleHAiOjAsImlhdCI6MTU4OTgyMzEyMSwianRpIjoiOTg2NjVjYWYtY2RmMy00Y2JkLTgxYzUtODBiNGY3MWNmZDJhIiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL2p3ZWRlbW8iLCJhdWQiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvandlZGVtbyIsInR5cCI6IlJlZ2lzdHJhdGlvbkFjY2Vzc1Rva2VuIiwicmVnaXN0cmF0aW9uX2F1dGgiOiJhdXRoZW50aWNhdGVkIn0.O0TG-CwW0vnyokrhzK9k3QKkt5n71P6FUheBD4hTpG8”
“$KC_ISSUER/protocol/openid-connect/token”
)
echo $KC_RESPONSE | jq -C .

总是抛出

“错误”:“未授权客户端”, “error_description”:“使用签名 JWT 的客户端身份验证失败:无法识别客户端。 JWT 令牌上缺少发行人” 我不知道如何获取 client_assertion,我尝试了不同的方法,但它不起作用。

【问题讨论】:

【参考方案1】:

您的 client_assertion 缺少“sub”声明,其值应为“client_id”。

https://kb.authlete.com/en/s/oauth-and-openid-connect/a/client-secret-jwt 的文档帮助我找到了此 api 所需的声明。

【讨论】:

以上是关于如何在 KeyCloak 中的签名 JWT 中获取 client_assertion的主要内容,如果未能解决你的问题,请参考以下文章

如何验证在 jwt.io 上使用 Keycloak 身份验证提供程序创建的 HS256 签名 JWT 令牌

如何使用 java 验证由 keycloak 签名的 JWT

在 Spring Boot 中使用 Keycloak 实现 JWT、JWE 和 JWS(签名 JWT)

无法验证 RS256 签名的 JWT

Keycloak:使用新创建的客户端和用户获取 JWT

Keycloak 客户端映射器将领域名称显示为 JWT 令牌中的单个属性