我们正在使用Jetty的keycloak-adapter来使用Keycloak进行身份验证和授权。 根据OIDC身份验证流程的Keycloak文档:
“ 此流程的另一个重要方面是公共客户端与机密客户端的概念。
机密客户端在交换令牌的临时代码时需要提供客户端机密。公共客户端不需要提供此客户端密钥。只要严格执行HTTPS,并且您对为客户端注册哪些重定向URI都非常严格,公共客户端就可以了。
HTML5 / JavaScript客户端始终必须是公共客户端,因为无法以安全的方式向其传输客户端机密。”
我们有连接到Jetty并使用auth的webapp。因此,我们创建了一个公共客户端,它非常适合webapp / REST身份验证。
问题在于,一旦启用授权,客户端类型便会从“公共”转换为“机密”,并且不允许将其重置为“公共”。现在,我们在喝汤。由于授权,我们无法拥有公共客户端,也无法将Web应用连接到机密客户端。
这似乎与我们矛盾。知道为什么客户需要对授权保密吗?关于此的任何帮助我们如何克服这个问题?
谢谢。
答案 0 :(得分:0)
据我了解,您将前端和后端应用程序分开了。如果您的前端是一个静态Web应用程序,而不是由相同的后端应用程序(服务器)提供服务,并且您的后端是一个简单的REST API,那么您将配置两个Keycloak客户端:
public
客户端。它将负责获取JWT令牌。 bearer-only
客户端,该客户端将附加到您的后端应用程序。要启用授权,您将创建角色(领域或客户端范围,在领域级别开始,因为它更容易理解)。然后,将在Keycloak管理UI中为每个用户分配一个角色。基于此,您应该配置您的keycloak适配器配置(在后端)。
考虑到所有问题,为了与您的REST API对话,您需要在Authorization标头中的每个HTTP请求上附加一个JWT令牌。根据您的前端框架,您可以使用以下任意一种:
P.S。为了进行调试,我刚刚编写了一个名为brauzie的CLI工具 这将帮助您获取和分析JWT令牌(作用域,角色等)。它可以用于公共和机密客户。您 也可以使用Postman和https://jwt.io
HTH:)
答案 1 :(得分:0)
我认为您在创建客户端时是指Keycloak管理控制台中的“已启用授权”开关。如果您翻过标签旁边的问号,则会看到提示“为客户端启用/禁用细粒度授权支持。
Create client in Keycloak admin console (v 6.0.1)
这是用于为用作资源服务器的后端应用程序创建客户端时使用的。在这种情况下,客户将是机密的。
如果您要为前端应用程序创建客户端,以验证用户身份并获取JWT,则不需要。
另请参阅:https://www.keycloak.org/docs/latest/authorization_services/index.html
答案 2 :(得分:0)
经过深思熟虑,我们发现在连接到公共客户端时并不需要真正启用授权。当任何请求到达公共客户端时,它仅执行身份验证部分。当实际请求使用机密客户端到达资源服务器(在我们的示例中为Jetty)上时,将完成授权部分(因为Jetty知道其中配置了机密客户端)。