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

Posted

技术标签:

【中文标题】如何获取访问令牌中的角色:keycloak【英文标题】:how to get the roles in access token: keycloak 【发布时间】:2020-10-02 21:20:53 【问题描述】:

我想做什么:

    我有一个接受登录凭据的应用程序:用户的用户名和密码。我有一个内部调用keycloak 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) else: 返回错误信息。

现在,我该怎么做 (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】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

如果不允许使用完整范围,那么我只能获取客户端角色,而不是用户的有效角色。但是,如果我打开全部范围,所有内容都可用。知道我错过了什么吗?【参考方案3】:

在 Keycloak 管理控制台中,您可以在客户端下配置 Mappers。添加“用户领域角色”类型的内置映射器,然后打开其配置,例如如果需要,更改令牌声明名称。

可以类似地配置客户端角色,但默认情况下它们会在名为 resource_access.$client_id.roles 的令牌中返回

您可以在客户端解析令牌以查找角色。例如。在 Angular 应用程序中并使用 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

在这两种表示中,您都会在客户端映射器配置中定义的“令牌声明名称”下找到角色

【讨论】:

感谢您的回复。这是否意味着我们需要为此解析令牌?我在收到的令牌中没有看到您提到的类似 resource_access 的东西。我们是否需要对令牌字符串进行编码才能获取这些数据? 是的,您需要解析令牌,但任何客户端适配器都会以解析的形式为您获取令牌。例如,我正在使用 keycloak-angular,我可以从我的 Angular 应用程序 keycloak.getKeycloakInstance().tokenParsed 进行以下调用。这让我将令牌作为 json 对象 哦。我的是一个弹簧启动应用程序。在那我有我自己的rest api客户端(内部使用okhttp),它按原样检索http响应。在这个阶段我可以使用适配器或库来读取令牌吗? 我什至看过这个课程:keycloak.org/docs-api/6.0/javadocs/org/keycloak/representations/…。但它与用户角色没有任何关系。我期待这个类中有一个函数,比如:getRoles() 在上面的链接中检查“otherClaims”。如果你配置了客户端映射器,你会在 otherClaims 下找到角色

以上是关于如何获取访问令牌中的角色:keycloak的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有管理员帐户的情况下通过 REST 获取 Keycloak 用户

如何使用邮递员从 keycloak 获取访问令牌(授权码流)

Keycloak 访问令牌与 UserInfo 令牌?

撤销 Keycloak 访问令牌

在 Keycloak SPI/Provider 中获取当前用户访问令牌(初始登录时)

如何使用 Rest Assured 从 KeyCloak 服务获取承载令牌