【发布时间】:2019-07-01 16:05:53
【问题描述】:
在微服务架构中,我们使用来自 keycloak 的 JWT 令牌。现在我们想要获得第二个权限更少的访问令牌(更少的声明/更少的角色)。用例是:新的访问令牌应该允许其所有者访问文档存储中的一个文档。为什么?限制某人在窃取此令牌时可能造成的损害。
理想情况下,我们可以通过特殊的 refresh_token 调用获得第二个令牌(持有刷新令牌的用户有权获得完全访问令牌,因此他也应该能够获得部分访问令牌)。我们怎么能这样做?
使用范围似乎不起作用:给定范围列表仅在登录时评估(因此在刷新令牌时,我不能采用范围列表)。
我也尝试了解https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_overview 或RPT。但不幸的是,我缺少一些文档(我的尝试失败了)。
还有其他想法吗?或者甚至是一个展示如何做到这一点的示例?
稍后编辑以使我关于 RPT 的问题更加明确: https://www.keycloak.org/docs/latest/authorization_services/index.html#_service_overview 说:
... Keycloak 授权服务提供对 OAuth2 的扩展,以 允许基于所有策略的处理来发布访问令牌 与被请求的资源或范围相关联。这意味着 资源服务器可以强制访问其受保护的资源,基于 由服务器授予并由访问令牌持有的权限。在钥匙斗篷里 授权服务具有权限的访问令牌称为 Requesting Party Token 简称 RPT。
这种具有权限的访问令牌可以用于我们的目标吗?
在我的实验中,我可以通过 grant_type=urn:ietf:params:oauth:grant-type:uma-ticket 获得令牌。但是有一些问题:
我不得不更改 keycloak 中的一些设置以启用权限(在它会说“客户端不支持权限”之前)。进行这些更改后,我的正常登录调用将不再起作用(我可以在我的令牌仍然有效时进行测试)。我不得不修改我的 keycloak 配置才能继续工作。
我不太了解用于此功能的权限模型
端到端的例子会很有用(Keycloak 文档中的例子有点抽象)。
【问题讨论】:
-
这是一个有趣的问题+1。我根本不知道密钥斗篷,但是是什么阻止您使用类似于您用来生成初始 JWT 的代码?顺便说一句,您可能已经知道,在为文档颁发新的访问令牌之前,您需要使之前的 JWT 无效。否则,旧的仍然存在。
-
“是什么阻止了你使用类似于你用来生成初始 JWT 的代码” 部分令牌应该在登录后的某个时间生成(我不想存储登录凭据)。
-
为了提高应用程序的安全级别,我会: - 使用较短的访问令牌生命周期值 - 在 SSL 上使用 HTTP - 限制用户会话超时 您正在考虑的内容意味着额外的复杂层(如据我所知)这可能涉及自己编写安全相关代码以扩展 OIDC 协议,这可能会带来更多风险。
-
@XtremeBiker:感谢您列出的良好做法(我们已经在应用它们)。您是否暗示我们想要做的事情在 Keycloak 中是不可能的?
-
不客气!这是使用此工具进行资源配置功能强大的一个示例,并不适合您的具体情况。在您的情况下,您需要应用程序为特定用户分配资源,而不是 Alice(请参阅文档中的 8.4 chapter)。
标签: jwt microservices keycloak rpt