Keycloak - 如何请求一个具有自定义生命周期的令牌?

7

背景:我们使用Keycloak通过通常通过授权头传递令牌来保护我们的API。但是,这些API还允许用户下载文件(例如:https://api.service.io/users.xlsx)。

为了使用这些“下载端点”,我们的Web客户端应用程序通过查询字符串传递用户令牌。(例如:https://api.service.io/users.xlsx?accessToken=${bearerToken}))。

问题:通过查询字符串传递令牌存在几个安全漏洞(浏览器历史记录等)。因此,我们希望传递一个非常短暂的令牌(例如,15秒的寿命)而不是普通令牌(默认情况下为300秒的寿命)。

问题:我们如何从Keycloak API请求不同的令牌(例如,/realms/#{realm_id}/protocol/openid-connect/token),方法是:

  • 提供普通访问令牌(而不是凭据);
  • 并且指定不同的生命周期?

你有没有看过文档?http://www.keycloak.org/docs/latest/server_admin/index.html#_timeouts - Kavindu Dodanduwa
在查询字符串中发送访问是不好的。为什么不使用头文件呢?当您获得SSL时,您会获得加密。访问日志也不会泄露它们。 - Kavindu Dodanduwa
1
我确实已经阅读了文档。我可以使用管理 API 更改默认寿命,但这不是重点。我想保留大多数令牌的默认寿命。然而,当请求特定令牌时,我希望能够指定不同的寿命。关于您的第二个评论,您并不能总是使用 Headers。例如,当您将浏览器重定向到下载链接时,您无法使用 Headers。 - Lorent Lempereur
好的,现在我明白了你的需求。至于第二点,你可以在页面加载时使用表单提交(但具体情况取决于场景)。对于最初的问题,你不能在认证请求中指定范围值并限制访问令牌的访问级别吗? - Kavindu Dodanduwa
2个回答

5
阅读了Keycloak的源代码后,发现在运行时不可能(版本3.4.2.Final)要求指定寿命。
然而,我开发了一个Keycloak自定义REST端点来实现这一点。 https://github.com/looorent/keycloak-configurable-token-api 当将此JAR文件部署在Keycloak中时,您可以在运行时要求给定的生命周期。例如: $ curl -X POST -d '{ "tokenLifespanInSeconds": 20}' -H "Content-Type: application/json" -H "Authorization: Bearer <user-access-token>" http://auth.service.io/auth/realms/a-realm/configurable-token

1
对于想要获取一个用于内部使用(或任何其他用途)的永久令牌,而又不使用任何外部jar包的人来说,有一个解决办法。
  1. 创建一个客户端并为该客户端启用客户端凭据:启用client-authenticationclient-authorization

  2. 对于该客户端,请记住客户端ID和客户端密钥,然后向Keycloak发送以下请求:

    curl --location 'https://my.keycloak.url/realms/realm-name/protocol/openid-connect/token' \
    --header 'Content-Type: application/x-www-form-urlencoded' \
    --data-urlencode 'client_id=my-client-id' \
    --data-urlencode 'client_secret=my-client-secret' \
    --data-urlencode 'grant_type=client_credentials'
    

    这将返回一个带有access_token的JSON。

  3. 使用此访问令牌。

  4. 如果您希望为此令牌分配一组roles,只需转到您的客户端并单击Service account roles选项卡。在这里,您可以为该客户端添加一个或多个角色。任何进一步的令牌请求都将提供具有分配角色的令牌。


请注意,尽管此访问令牌具有时间限制并将很快过期,但您始终可以通过第2步中提到的API调用直接获取新的令牌。因此,无需人工干预。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接