我正在为Keycloak文档中描述的服务帐户生成一个访问令牌。
curl --location --request POST 'http://my.domain/auth/realms/aRealm/protocol/openid-connect/token' \
--header 'Authorization: Basic YXBcnZlcjpNlpuMwRWk1Y02ZFRE15vVp2YUdHJibmNalVvMFmxzVNQVg==' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials'
我确实得到了一个令牌回来,但它在30分钟内到期,就像我在我的领域设置中配置它们一样,供正常用户使用。
但是对于作为服务帐户使用,我不想要这么长时间的令牌。即使是10-15秒也应该足够生成令牌,然后立即向服务器发出请求。
我在Google auth docs(https://cloud.google.com/iam/docs/create-short-lived-credentials-direct#rest_2)中看到过一个类似的功能,通过传递一个lifetime
参数,您可以在其中请求具有特定生命周期的令牌。
Keycloak文档(https://www.keycloak.org/docs/latest/server_admin/#_service_accounts)没有提到任何关于短期令牌的内容。我是否遗漏了提到类似内容的章节?或者是否有其他方法可以创建短期令牌?
编辑:
创建的Keycloak客户端用于用户登录系统。对于这种情况,我希望他们的令牌在再次刷新之前有效30分钟。但是对于服务帐户使用(当我希望我的分布式代码向我自己的服务器发出API请求时),我希望这些令牌具有非常短的生命周期(足以发出API调用)。
2条答案
按热度按时间3pvhb19x1#
查看您的需求,我感觉您将关注点和不同的身份验证流混合在一起。
创建的Keycloak客户端被用户用来登录系统。对于这个用例,我希望他们的令牌在再次刷新之前30分钟内有效。
在不了解有关应用程序的更多详细信息的情况下,此用例通常通过使用***公共客户端***来解决。该客户端通常使用标准流、隐式流或启用的直接访问授权(不推荐)。如果可能,最好使用标准流。这些流也可以用于 * 机密客户端 *--只要机密安全地存储在后端--但是,这不是“非常自然”,也没有必要。
服务帐户流(* 即 * OAuth2术语中的客户端凭据)强制使用 * 机密客户端 *。因此,在请求中使用 client_secret 参数。
因此,我们开始看到最佳实践与您所陈述的要求之间的冲突。
IMO最干净的解决方案是拥有一个 * 公共客户端 *,供用户使用适当的流程进行正常身份验证。在该客户端中,您可以将令牌生命周期设置为30分钟。对于:
但是对于服务帐户使用(当我希望我的分布式代码向我自己的服务器发出API请求时),我希望这些令牌具有非常短的生存期(足以进行API调用)。
对于该用例,请使用启用了服务帐户流的不同客户端 * 机密客户端 *。转到客户端
Advanced Settings
菜单,并将Access Token Lifespan
设置为1分钟(例如)。此值将覆盖在领域级别设置的值(实际上,in practice in can be more complicated than that)。您可以选择的最小时间粒度是分钟,对于秒,您必须使用@ BenchVue所展示的方法。w8f9ii692#
您可以通过PUT HTTP调用更改特定客户端的“访问.令牌.寿命”。
PUT调用**http://my.domain/auth/realms/aRealm/clients/client-id**
不记名令牌需要由具有realms-manage角色的管理员(或主管理员、manage-clients)获取
x1c 0d1x这是示例my.domain:访问的页面不存在。
a领域:测试
客户端标识:a6654164-d2 f5 - 451 d-8 f8 c-25 f00 f29 eec 5
“访问.令牌.寿命”:十五
您可以通过GET HTTP调用检查它的值。“expires_in”:15告诉您生存期
在这里,这个值是15秒。它应该与我通过PUT调用发送的值相匹配。