oauth-2.0 - 如何获取访问令牌中的角色:keycloak
问题描述
我正在尝试做的事情:
我有一个接受登录凭据的应用程序:用户的用户名和密码。我有一个内部调用 keycloak REST API 的 api:/auth/realms/realmname/protocol/openid-connect/token 并获取该用户的访问令牌。
现在我正在构建另一个 REST API 来访问我想要执行以下操作的资源: doSomething(accesstoken, data)
{
一个)
call keycloak API to validate access token and get roles.
b)如果角色==经理,流程(数据)
c) 其他:返回错误信息。
}
现在,我该怎么做 (a):验证访问令牌并获取与之关联的角色。我知道我们可以这样做:auth/realms/realmname/protocol/openid-connect/userinfo 但这仅提供有关用户的详细信息,例如姓名、电子邮件等,但不显示任何角色。这是我得到的一个例子:
{
"name": "test user",
"sub": "e2bad34d-a1a9-4d70-ac84-bd3a3246023e",
"email_verified": false,
"preferred_username": "user",
"given_name": "test",
"family_name": "user"
}
正如所见,它根本没有给出角色。然后,我如何判断此访问令牌具有哪些角色?有趣的是,当我搜索这个时,许多资源都在建议上面的 userinfo 端点。但这只是告诉我我提供的访问令牌是有效的。不为此提供角色。换句话说 - 它验证但不授权。
请建议。
谢谢, 阿南德
解决方案
在 Keycloak 管理控制台中,您可以在客户端下配置 Mappers。添加“用户领域角色”类型的内置映射器,然后打开其配置,例如,如果需要,更改令牌声明名称。
客户端角色可以类似地配置,但默认情况下,它们在名为 resource_access.${client_id}.roles 的令牌中返回
在客户端,您可以解析令牌以查找角色。例如,在 Angular 应用程序中并使用 keycloak-angular 适配器,您可以通过调用 keycloak.getKeycloakInstance().tokenParsed 将令牌作为 json 对象。
在 Spring Boot 应用程序中并使用 Keycloak java api,您可以在以下类 https://www.keycloak.org/docs-api/10.0/javadocs/org/keycloak/representations中的“otherClaim”字段下找到角色/AccessTokenResponse.html
在这两种表示中,您都会在客户端映射器配置中定义的“令牌声明名称”下找到角色
推荐阅读
- spring-mvc - Spock 测试中的 SpringBootTest RestController 结果为 404
- python - 如何在一张表中同时显示总计数和百分比
- react-native - 反应原生 axios
- html - 在 iOS 设备上被忽略的链接
- c# - Roslyn CodeFixProvider 添加具有参数值的属性
- c++ - 如何创建 CMake 文件来编译项目的所有 C++ 文件?
- json - 在文本区域中为 Google Script 保存价值
- visual-studio - 当(仅).exe 内容项脏时,如何让 VS 认为我的项目脏?
- sql - 在 T-SQL 触发器中评估更新函数内的动态列名
- javascript - 如果在 Firebase 中找不到语句变量 == null?