keycloak 不记名客户端:它们为什么存在?

kur*_*tgn 39 keycloak

我试图围绕bearer-onlyKeycloak中客户的概念。

我了解公共与机密的概念以及服务帐户和其他grant_type=client_credentials东西的概念。但是bearer-only,我被卡住了。

谷歌搜索只显示讨论的片段说:

您无法通过bearer-only客户端从 keycloak 获取令牌。

文档也不清楚。他们只说:

不记名访问类型意味着应用程序只允许不记名令牌请求。

好的,如果我的应用程序只允许不记名令牌请求,如果我无法使用客户端 ID/客户端密码从 Keycloak 获取该令牌,我该如何获取它?

如果你不能获得令牌,你能得到什么?为什么会有这些客户?有人可以提供一个使用这种类型客户端的例子吗?

Sub*_*shi 40

Bearer-only 接入类型含义

不记名访问类型意味着应用程序只允许不记名令牌请求。如果启用此功能,则此应用程序无法参与浏览器登录。

因此,如果您选择您的客户端,bearer-only那么在这种情况下,keycloak 适配器将不会尝试对用户进行身份验证,而只会验证不记名令牌。这就是为什么 keycloak 文档还提到bearer-only应用程序不允许从浏览器登录的原因。

如果你不能获得令牌,你能得到什么?为什么会有这些客户?

您的客户端不能在 Keycloak 服务器上设置为仅承载。不过,您仍然可以在适配器配置上使用仅承载。Keycloak 不允许“仅承载”客户端(在服务器上设置客户端时)从服务器获取令牌。尝试在服务器上将您的客户端更改为“机密”,并在您的适配器配置 (keycloak.json) 上设置仅承载。

因此,如果您理解上述语句,那么如果您有两个微服务在这种情况下相互通信,则调用者将是confidential,被调用者将是bearer-only

而Keycloak也提到

仅承载客户端是从不启动登录的 Web 服务。它通常用于保护后端。

因此,如果您想使用任何适配器,您可以bearer-only根据需要使用

编辑-

让我们详细了解一下..让我们看一个示例,我有一个示例web-app,一个rest-app用于 Web 应用程序,我使用的是React/Angular/JSF任何前端技术,而对于后端,我使用的是基于 Java 的 rest-apiNodejs

现在对于上述要求,我必须确保产品(web-app,rest-api)的安全,那么我的工作是什么?我将如何通过 Keycloak 保护这两个应用程序?

所以这里是详细解释

  1. 我必须在 keycloak 的一个领域内创建两个客户端
  2. 客户端 A将由网络应用程序使用
  3. 客户端 B将被 rest-api 使用
  4. 那么现在的问题将是为什么有两个客户端?
  5. 对于网络应用程序,我们希望用户必须通过 GUI 登录然后只生成令牌
  6. 对于 rest-api,我们不想使用基于 GUI 的 api,因为这些 api 被 web-app 消耗,但我们仍然必须安全地访问 rest-api。
  7. 现在转到客户端 A 并使其访问类型 public客户端,以便网络应用程序将要求通过 keycloak GUI 或您的登录页面登录,然后生成令牌
  8. 因此,rest-api 使用的上述步骤中生成的相同令牌将根据用户角色和其他信息数据获取。因此,客户端 B 的访问类型将是web-app 生成的令牌传递给 rest-api 并将其用于验证用户。bearer-only

希望它会有所帮助。有人想添加更多他/她可以随意添加。

  • 感谢 Subodh 的解释!因此,这意味着如果我的客户端仅持有者,我唯一可用的选择就是向 Keycloak 发出验证请求以确保令牌有效。正确的?但如果是这样的话,为什么还要调用 Keycloak 呢?如果我的客户端有一个公共 Keycloak 密钥,它可以使用此密钥验证它,而无需调用 Keycloak。 (2认同)

Yur*_*y P 10

在我的理解中,当你有一些内部服务时使用它。假设您有ServiceAServiceB。一个用户调用ServiceA它在手调用ServiceBServiceB永远不会被用户直接调用,只会被其他服务调用。ServiceA将使用用户的凭据获取令牌。然后将使用此令牌调用ServiceB. ServiceB永远不会启动登录。它只会使用令牌来验证权限。

在这种情况下,ServiceA 将是confidential,ServiceB 将是bearer-only客户端。


Tho*_*MIN 9

简短回答:您无法使用仅不记名客户端获取访问令牌,但您可以使用其他客户端获取仅不记名客户端可以接受的访问令牌。

更多细节 仅承载客户端有用地表示后端应用程序,如 Web 服务,由前端应用程序调用并由授权服务器保护(= keycloak)

后端/Web 服务应用程序不是由用户直接调用的,因此无法在Oauth2.0 用户交互流程中发挥作用。设置“bearer-only”将此事实记录到keycloak服务器,允许管理员配置客户端而无需其他强制值(例如重定向uri...),并在有人试图获取此类客户端的令牌时允许有用的错误消息

但是,这并不意味着您不能为此客户端配置特定角色:因此它需要出现在 keycloak 领域中。

此外,bearer-only 客户端需要验证收到的访问令牌,尤其是,如果激活了这个(推荐)适配器功能“verify-token-audience”,则bearer-only 客户端需要验证是否已为其颁发了访问令牌:仅承载客户端必须位于访问令牌的受众属性中:请参阅https://www.keycloak.org/docs/latest/server_admin/index.html#_audience

对于通过 keycloak 管理的受众,仅承载客户端需要在 keycloak 领域注册。