密钥保护公共客户端和授权

我们正在使用带有Jetty的钥匙斗篷适配器,以使用Keycloak进行身份验证和授权。根据 OIDC 身份验证流程的密钥保护文档

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

HTML5/JavaScript 客户端始终必须是公共客户端,因为无法以安全的方式将客户端密钥传输给它们。

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


答案 1

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

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

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

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

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

HTH :)


答案 2

我认为您在创建客户端时指的是Keycloak管理控制台中的“授权已启用”开关。如果越过标签旁边的问号,您将看到提示“为客户端启用/禁用细粒度授权支持。

在密钥斗篷管理控制台中创建客户端 (v 6.0.1)

这适用于为用作资源服务器的后端应用程序创建客户端的情况。在这种情况下,客户将是保密的。

如果要为前端应用创建客户端,对用户进行身份验证并获取 JWT,则不需要它。

另请参见:https://www.keycloak.org/docs/latest/authorization_services/index.html


推荐