Keycloak 在同一领域实现用户和应用程序身份验证

Keycloak implementing both user and app authentication in the same realm

我有这样的设置:

  1. Back-end REST API 应用程序 - 单个 云服务器中的实例 运行 - 我们称它为 A

  2. Public 用户的移动应用程序和浏览器客户端 - 让我们将它们统称为 X

我们已经在使用 Keycloak 进行身份和访问管理。根据当前设置,

现在,我们要引入back-end应用程序的新层,即

  1. Back-end REST API 应用程序 - 多个 实例 运行 在 On-prem 跨不同物理位置的服务器 - 我们把它们统称为B.

现在,BX都是A的客户,[即A 服务于 BX].

请说明:

  1. 我是否应该为 B 在同一领域中创建另一种类型的客户端,如下所示?

    • BA客户端凭据授予流程 即我必须创建另一个 Client-Type 作为 机密 对于 BA , 为 B 的每个实例配置一个 service-account。
      • 如果是,请指导我如何在 A 中配置两个身份验证流程,即 A 必须对两个 BX.
  2. 我觉得这是个坏主意 - 按原样使用现有设置,如下所述。

    根据新的业务逻辑,

    • X logs-in 应用程序(mobile/web 应用程序)使用用户名和密码调用 API A 生成一个二维码,其中将包含用户的 (X's) 访问令牌的哈希值和一些其他信息。

    • A 在数据库

      中存储 X 的哈希和访问令牌
    • B 获取 X 用来访问 A[ 的访问令牌的哈希值=115=],来自用户扫描的二维码。 B 通过调用 A

      的 API 使用散列来验证 QRCode 的真实性

    如上述业务逻辑中所述,如果需要,A可以暴露一个API,其中可以通过get请求检索上述用户访问令牌,通过将哈希作为请求 header 参数或查询发送。 B 可以进一步使用此令牌进一步 API 调用 A.

我认为上述想法很糟糕,因为,我们不应该通过互联网发送用户访问令牌,即使 B[= 之间存在 SSL/TLS 连接115=] 和 A.

  1. Client-Type,Bearer-Only可以在B之间使用吗A?如果是,请指导我。

由于您同时拥有 Public 和本地服务作为客户,我建议如下:

  1. 如您所说,X 作为 public 客户端应使用密码授予
  2. B 应该使用客户端凭据机制通过 Keycloak 对自己进行身份验证。 Keycloak 将通过 ${kc.realm-url}/protocol/openid-connect/token 端点为其提供访问令牌。此访问令牌可以发送给 A.
  3. “A”也应该是具有自己凭据的注册客户端。
  4. 当“A”收到来自 X 或 B 的请求时,它应该使用一种称为通过 Introspection 端点进行令牌验证的机制,它将通过调用 Keycloak 来验证令牌。 内省端点需要访问令牌、客户端 ID 和客户端密码。

这样A就可以确定自己收到的token确实是Keycloak签发的