如何获得访问令牌中的角色:keycloak

时间:2020-06-13 02:13:22

标签: oauth-2.0 keycloak openid-connect keycloak-gatekeeper

我要做什么:

  1. 我有一个使用登录凭据的应用程序:用户的用户名和密码。我有一个REST API,可以在内部调用密钥斗篷REST API:/ auth / realms / realmname / protocol / openid-connect / token 并获取该用户的访问令牌。

  2. 现在,我正在构建另一个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端点。但这仅告诉我我提供的访问令牌有效。不为此提供角色。 换句话说,它是认证但不授权。

请提出建议。

谢谢, 阿南德

3 个答案:

答案 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)

此外,如果不允许使用整个作用域,则需要将相关角色添加到作用域中,以便它们可以出现在令牌中。

enter image description here

答案 2 :(得分:0)

在角色部分添加角色后,需要将可用角色移动到相应客户端部分范围选项卡的分配角色中。

[1]: https://i.stack.imgur.com/rPI0V.png