Keycloak公共客户端和授权

Num*_*Uno 6 java authorization web-applications openid-connect keycloak

我们正在Jetty上使用keycloak-adapter,以使用Keycloak进行身份验证和授权。根据OIDC身份验证流程的Keycloak文档

该流程的另一个重要方面是公众与机密客户的概念。机密客户端在交换令牌的临时代码时需要提供客户端机密。公共客户端不需要提供此客户端密钥。只要严格执行HTTPS,并且您为该客户端注册了什么重定向URI,您就非常严格,公共客户端就可以了。

HTML5 / JavaScript客户端始终必须是公共客户端,因为无法以安全的方式向其传输客户端机密。

我们有连接到Jetty并使用auth的webapp。因此,我们创建了一个公共客户端,它对于webapp / REST身份验证非常有用。
问题是,一旦启用授权,客户端类型就会从“公共”转换为“机密”,并且不允许将其重置为“公共”。现在,我们在喝汤。由于授权,我们无法拥有公共客户端,也无法将Web应用连接到机密客户端。
这似乎与我们矛盾。知道为什么客户需要对授权保密吗?在这方面有什么帮助我们如何克服这个问题?
谢谢。

mas*_*ick 16

据我了解,您的前端和后端应用程序是分开的。如果您的前端是一个静态 Web 应用程序并且不是由同一个后端应用程序(服务器)提供服务,而您的后端是一个简单的 REST API - 那么您将配置两个 Keycloak 客户端:

  • public前端应用程序的客户端。它将负责获取 JWT 令牌。
  • bearer-only 客户端,它将附加到您的后端应用程序。

要启用授权,您将创建角色(领域或客户端范围,从领域级别开始,因为它更容易理解)。然后将在 Keycloak 管理 UI 中为每个用户分配一个角色。基于此,您应该配置您的 keycloak 适配器配置(在后端)。

考虑到所有因素,为了与您的 REST API 通信,您需要将 JWT 令牌附加到 Authorization 标头中的每个 HTTP 请求。根据您的前端框架,您可以使用以下任一方法:

PS 为了调试,我刚刚编写了一个名为brauzie的 CLI 工具 ,它可以帮助您获取和分析 JWT 令牌(范围、角色等)。它可以用于公共和机密客户端。您也可以使用Postmanhttps://jwt.io

哈 :)

  • 您能详细说明一下授权应该如何配置吗?如果 REST API 使用从客户端传递的 JWT 令牌来评估 keycloak 的资源访问,我会收到“客户端应用程序 [public-client] 未注册为资源服务器。”,因为 keycloak 评估“azp”(已发出- for) JWT https://github.com/keycloak/keycloak/blob/11.0.3/services/src/main/java/org/keycloak/authorization/protection/ProtectionService.java#L133 的字段。 (3认同)