如何使用从公共客户端发出的令牌查询 keycloak 资源权限

Posted

技术标签:

【中文标题】如何使用从公共客户端发出的令牌查询 keycloak 资源权限【英文标题】:How to query keycloak resource permission with a token issued from a public client 【发布时间】:2021-09-28 14:36:44 【问题描述】:

我有一个受 keycloak 保护的前端 javascript 客户端。前端应用的 Keycloak 客户端的类型为 Public,名为 blog_gui

我还有一个由名为“blog_api”的Confidential 客户端保护的API,并启用了Authorization

当我从我的前端应用程序向 API 发出请求时,我将由 keycloak 从 public 客户端 (blog_gui) 发出的 JWT 作为请求标头中的不记名令牌发送。

在 API 中,我想检查发送 JWT 的前端应用程序是否有权访问特定资源。因此,我通过以下 URL 向 keycloak 服务器发送请求,包括来自前端应用程序的 JWT 作为 Bearer 令牌

http://$host:$post/auth/realms/$realm/authz/protection/uma-policy

我从 keycloak 得到的结果是


    "error": "invalid_clientId",
    "error_description": "Client application [blog_gui] is not registered as a resource server."

【问题讨论】:

您能否添加您发送到 Keycloak 的完整请求,包括标头和有效负载? @sventorben 我在前端 JS 应用程序中使用 keycloak-js 适配器登录。适配器为我完成了与 Keycloak 的所有通信。从我从 keycloak-js 得到的响应中,我获取了令牌并将其与我的问题中描述的 GET 请求一起使用。该 GET 请求包含一个 Authorization 标头,其值为 Bearer <token from keycloak> 你的前端和后端是否映射到 Keycloak 中的同一个客户端? 【参考方案1】:

在您的场景中,keycloak-js 将向 Keycloak 查询具有受众/客户端 blog_gui 的访问令牌。这个客户端是公共的,所以它不是一个注册的资源服务器。 您可能需要执行token exchange 来获取后端客户端的访问令牌 (blog_api) 并使用获得的令牌来查询 uma-policy 端点。您可以在Authorization Services docs over here 中找到有关如何查询端点的更多信息。

确保您的 blog_api 客户端是机密的并且已打开 Authorization Enabled。客户端设置方法请参考this documentation。

【讨论】:

以上是关于如何使用从公共客户端发出的令牌查询 keycloak 资源权限的主要内容,如果未能解决你的问题,请参考以下文章

如何配置必须使用“密码”授权类型从授权服务器请求令牌的客户端 Java 应用程序?

java - 如何从Java Spring Boot中的请求标头获取不记名令牌?

如何正确使用 Bearer 代币?

如何将我的 Instagram 访问令牌从我的 Express 服务器发送到 React 客户端?

在 Spring Boot 中从 jwt 获取附加属性

公共 Laravel API 的身份验证