我正在努力解决Keycloak中http://localhost:2990/jira/rest/zapi/latest/cycle?projectId=
个客户端的概念。
我了解公开与保密的概念以及服务帐户和bearer-only
的概念。但是,grant_type=client_credentials
让我陷于困境。
Google搜索只显示了以下讨论的片段:
您无法使用
bearer-only
客户端从密钥斗篷获得令牌。
文档也不清楚。他们只说:
仅承载者访问类型意味着该应用程序仅允许承载令牌请求。
好吧,如果我的应用仅允许承载令牌请求,如果我无法使用客户端ID /客户端机密从Keycloak获取令牌,该如何获取令牌?
如果您无法获得令牌,那您还能做什么?为什么这些客户存在?有人可以提供使用此类客户端的示例吗?
答案 0 :(得分:5)
简短的回答:您不能使用仅承载客户端来获取访问令牌,但是可以获取仅承载客户端可以使用另一个客户端接受的访问令牌。
更多详细信息 仅承载客户端可以有用地表示后端应用程序,例如Web服务,由前端应用程序调用并由授权服务器(= keycloak)保护
后端/ Web服务应用程序不会直接由用户调用,因此它们无法在Oauth2.0用户交互流中播放。设置“仅承载者”可将此事实记录到密钥斗篷服务器上,从而允许管理员在没有其他强制性值的情况下配置客户端(例如重定向uri…),并且如果有人尝试获取此类客户端的令牌,则允许有用的错误消息
但是,这并不意味着您不能为此客户端配置特定角色:因此它需要出现在密钥斗篷域中。
此外,仅承载客户端需要验证接收到的访问令牌,尤其是,如果激活了此(推荐)适配器功能“ verify-token-audience”,则仅承载客户端需要验证是否已颁发访问令牌为此:仅承载客户端必须位于访问令牌的Audience属性中: 参见https://www.keycloak.org/docs/latest/server_admin/index.html#_audience
对于通过密钥库进行受众管理,仅承载客户需要在密钥库领域中注册。
答案 1 :(得分:2)
仅承载者访问类型的含义
仅承载者访问类型意味着应用程序仅允许承载 令牌请求。如果启用此功能,则此应用程序无法 参与浏览器登录。
因此,如果您将客户端选择为bearer-only
,则在这种情况下,keycloak适配器将不会尝试对用户进行身份验证,而只会验证承载令牌。这就是为什么keycloak文档还提到bearer-only
应用程序的原因,将不允许浏览器登录。
如果您无法获得令牌,那您还能做什么?这些客户为什么存在?
您的客户端不能在Keycloak服务器上设置为仅承载。您可以 仍然在适配器配置上使用仅承载。钥匙斗篷 不允许“仅承载”客户端(在将客户端设置为 服务器)以从服务器获取令牌。尝试改变你的 客户端在服务器上设置为“机密”,并在您的服务器上设置仅承载 适配器配置(keycloak.json)。
因此,如果您理解上述说法,那么在这种情况下,如果您有两个相互通话的微服务,则呼叫者将为confidential
,被呼叫者将为bearer-only
Keycloak也提到了
仅承载者客户端是从未启动登录的Web服务。通常用于保护后端。
因此,如果您想使用任何适配器,则可以根据需要使用bearer-only
答案 2 :(得分:1)
据我了解,当您有一些内部服务时会使用它。
假设您有ServiceA
和ServiceB
。用户呼叫ServiceA
,而后者又手动呼叫ServiceB
。 ServiceB
永远不会被用户直接调用,只能由其他服务直接调用。 ServiceA
将使用用户的凭据获得令牌。然后将使用此令牌来调用ServiceB
。 ServiceB
将永远不会启动登录。它将仅使用令牌来验证权限。
在这种情况下,ServiceA将是confidential
个客户端,而ServiceB将是bearer-only
个客户端。
答案 3 :(得分:1)
为什么只有承载客户存在的另一个想法可能是有时将客户误用于角色容器,请参阅Keycloak用户邮件列表https://lists.jboss.org/pipermail/keycloak-user/2016-April/005731.html
上的以下讨论E。 G。默认客户端“领域管理”是仅承载客户端,其中包含用于管理领域中事物的角色。无需像这样在客户端上调用登录,因此公开和机密毫无意义。