如何在Access Token中获取角色: Keycloak

10

我要做的事情:

  1. 我有一个应用程序,需要输入用户的登录凭据:用户名和密码。我有一个REST API,内部调用keycloak REST API:/auth/realms/realmname/protocol/openid-connect/token,并获取此用户的访问令牌。

  2. 现在,我正在构建另一个REST API来访问资源,并想要执行以下操作:

    doSomething(accesstoken, data)

    {

    a) 调用keycloak API验证访问令牌并获取角色。

    b) 如果角色为manager,则处理数据。

    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端点。但这只告诉我提供的访问令牌是有效的。并未提供相应的角色。 换句话说-它进行了身份验证但没有进行授权。
请提供建议。
谢谢, 安南

1
你解决了这个问题吗? - SoT
3个回答

16
在Keycloak管理控制台中,您可以在客户端下配置映射器。添加内置类型为"User Realm Role"的映射器,然后打开其配置,例如更改令牌声明名称(Token Claim Name)。
类似地,可以配置客户端角色,但默认情况下它们以resource_access.${client_id}.roles的名字返回到令牌中。
在客户端上,您可以解析令牌以查找角色。例如,在使用keycloak-angular适配器的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 在这两种表示法中,您将在客户端映射器配置中定义的"Token Claim Name"下找到角色。

谢谢回复。这是否意味着我们需要解析令牌?我在收到的令牌中没有看到像您提到的resource_access这样的内容。我们需要对令牌字符串进行编码以获取此数据吗? - Omi
是的,您需要解析令牌,但任何客户端适配器都可以以解析形式获取令牌。例如,我正在使用keycloak-angular,我可以从我的angular应用程序中进行以下调用keycloak.getKeycloakInstance().tokenParsed。这将以json对象的形式获取令牌。 - Rasha Elsayed
我甚至查看了这个类: https://www.keycloak.org/docs-api/6.0/javadocs/org/keycloak/representations/AccessTokenResponse.html。 但它与用户角色无关。 我原本期望在这个类中有一个函数,如:getRoles()。 - Omi
在上面的链接中检查“otherClaims”。如果您配置了客户端映射器,则会在otherClaims下找到角色。 - Rasha Elsayed
有没有办法在自定义的Keycloak主题中识别用户角色? 如何在账户主题(在ftl文件中)中确定当前登录用户是否为管理员? - Charith Prabhagya
显示剩余2条评论

5
此外,如果未允许完整范围,则需要将相关角色添加到范围中,以便它们可以出现在令牌中。

enter image description here


如果不允许完整范围,则我只能获取客户端角色,而无法获取用户的有效角色。但是,如果我打开完整范围,则所有角色都可用。有任何想法我错过了什么吗? - Anwar Reefat

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

[1]: https://istack.dev59.com/rPI0V.webp


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接