Keycloak 在同一领域实现用户和应用程序身份验证
Keycloak implementing both user and app authentication in the same realm
我有这样的设置:
Back-end REST API 应用程序 - 单个 云服务器中的实例 运行 - 我们称它为 A
Public 用户的移动应用程序和浏览器客户端 - 让我们将它们统称为 X
我们已经在使用 Keycloak 进行身份和访问管理。根据当前设置,
- X到A使用密码授予流程,即——创建了一个客户端在带有 Client-Type 作为 Public 的 Keycloak 中用于用户管理和 X[=115= 的身份验证] 到 A.
现在,我们要引入back-end应用程序的新层,即
- Back-end REST API 应用程序 - 多个 实例 运行 在 On-prem 跨不同物理位置的服务器 - 我们把它们统称为B.
现在,B和X都是A的客户,[即A 服务于 B 和 X].
请说明:
我是否应该为 B 在同一领域中创建另一种类型的客户端,如下所示?
- B 到 A:客户端凭据授予流程 即我必须创建另一个 Client-Type 作为 机密 对于 B 到 A , 为 B 的每个实例配置一个 service-account。
- 如果是,请指导我如何在 A 中配置两个身份验证流程,即 A 必须对两个 B 和 X.
我觉得这是个坏主意 - 按原样使用现有设置,如下所述。
根据新的业务逻辑,
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.
- Client-Type,Bearer-Only可以在B之间使用吗 和 A?如果是,请指导我。
由于您同时拥有 Public 和本地服务作为客户,我建议如下:
- 如您所说,X 作为 public 客户端应使用密码授予
- B 应该使用客户端凭据机制通过 Keycloak 对自己进行身份验证。 Keycloak 将通过 ${kc.realm-url}/protocol/openid-connect/token 端点为其提供访问令牌。此访问令牌可以发送给 A.
- “A”也应该是具有自己凭据的注册客户端。
- 当“A”收到来自 X 或 B 的请求时,它应该使用一种称为通过 Introspection 端点进行令牌验证的机制,它将通过调用 Keycloak 来验证令牌。
内省端点需要访问令牌、客户端 ID 和客户端密码。
这样A就可以确定自己收到的token确实是Keycloak签发的
我有这样的设置:
Back-end REST API 应用程序 - 单个 云服务器中的实例 运行 - 我们称它为 A
Public 用户的移动应用程序和浏览器客户端 - 让我们将它们统称为 X
我们已经在使用 Keycloak 进行身份和访问管理。根据当前设置,
- X到A使用密码授予流程,即——创建了一个客户端在带有 Client-Type 作为 Public 的 Keycloak 中用于用户管理和 X[=115= 的身份验证] 到 A.
现在,我们要引入back-end应用程序的新层,即
- Back-end REST API 应用程序 - 多个 实例 运行 在 On-prem 跨不同物理位置的服务器 - 我们把它们统称为B.
现在,B和X都是A的客户,[即A 服务于 B 和 X].
请说明:
我是否应该为 B 在同一领域中创建另一种类型的客户端,如下所示?
- B 到 A:客户端凭据授予流程 即我必须创建另一个 Client-Type 作为 机密 对于 B 到 A , 为 B 的每个实例配置一个 service-account。
- 如果是,请指导我如何在 A 中配置两个身份验证流程,即 A 必须对两个 B 和 X.
- B 到 A:客户端凭据授予流程 即我必须创建另一个 Client-Type 作为 机密 对于 B 到 A , 为 B 的每个实例配置一个 service-account。
我觉得这是个坏主意 - 按原样使用现有设置,如下所述。
根据新的业务逻辑,
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.
- Client-Type,Bearer-Only可以在B之间使用吗 和 A?如果是,请指导我。
由于您同时拥有 Public 和本地服务作为客户,我建议如下:
- 如您所说,X 作为 public 客户端应使用密码授予
- B 应该使用客户端凭据机制通过 Keycloak 对自己进行身份验证。 Keycloak 将通过 ${kc.realm-url}/protocol/openid-connect/token 端点为其提供访问令牌。此访问令牌可以发送给 A.
- “A”也应该是具有自己凭据的注册客户端。
- 当“A”收到来自 X 或 B 的请求时,它应该使用一种称为通过 Introspection 端点进行令牌验证的机制,它将通过调用 Keycloak 来验证令牌。 内省端点需要访问令牌、客户端 ID 和客户端密码。
这样A就可以确定自己收到的token确实是Keycloak签发的