我要做什么:
我有一个使用登录凭据的应用程序:用户的用户名和密码。我有一个REST API,可以在内部调用密钥斗篷REST API:/ auth / realms / realmname / protocol / openid-connect / token 并获取该用户的访问令牌。
现在,我正在构建另一个REST API,以访问要执行以下操作的资源: doSomething(访问令牌,数据)
{
a)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端点。但这仅告诉我我提供的访问令牌有效。不为此提供角色。 换句话说,它是认证但不授权。
请提出建议。
谢谢, 阿南德
答案 0 :(得分:3)
在Keycloak管理控制台中,您可以在客户端下配置Mappers。添加类型为“用户领域角色”的内置映射器,然后打开其配置,例如如果需要,可以更改令牌声明名称。
可以类似地配置客户端角色,但是默认情况下,它们在令牌中以resource_access。$ {client_id} .roles名称命名。
您可以在客户端解析令牌以找到角色。例如。在有角度的应用程序中,并使用keycloak-angular适配器,可以通过调用keycloak.getKeycloakInstance()。tokenParsed将令牌作为json对象。
在Spring Boot应用程序中并使用Keycloak Java API,您可以在以下类的“ otherClaim”字段下找到角色 https://www.keycloak.org/docs-api/10.0/javadocs/org/keycloak/representations/AccessTokenResponse.html
在两种表示形式中,您都可以在客户端映射器配置中定义的“令牌声明名称”下找到角色
答案 1 :(得分:0)
答案 2 :(得分:0)