Keycloak 访问令牌与 UserInfo 令牌?

Posted

技术标签:

【中文标题】Keycloak 访问令牌与 UserInfo 令牌?【英文标题】:Keycloak Access Token vs UserInfo token? 【发布时间】:2018-07-27 10:10:44 【问题描述】:

使用 Keycloak 时访问令牌与用户信息令牌有何不同?

从 OAuth2/OpenIDConnect 我了解到访问令牌提供了用户已通过身份验证的信息 并且您需要使用用户信息令牌来获取有关用户及其个人资料/角色等的更多信息。

当我查看 https://jwt.io/ 与 UserInfo 令牌之类的访问令牌时。我能够获得有关用户个人资料和角色的相同信息。

为什么会这样,使用 Keycloak 时访问令牌与用户信息令牌有何不同?

【问题讨论】:

你能提供一些关于用户信息令牌的参考吗?我在规格中没有看到任何关于它的信息。 这些端点基于 OpenID Connect 标准(不是 Keycloak 特定的东西)。 - 令牌端点 (openid.net/specs/openid-connect-core-1_0.html#TokenEndpoint) “获取访问令牌,一个 ID 令牌” - UserInfo 端点 (openid.net/specs/openid-connect-core-1_0.html#UserInfo) “UserInfo 端点是一个 OAuth 2.0 受保护的资源,它返回关于经过身份验证的最终用户的声明。”跨度> 【参考方案1】:

访问令牌旨在为您提供对应用程序资源的访问权限。为了获得访问令牌,您必须使用spec 定义的任何流对自己进行身份验证。在 keycloak 中,访问令牌包含用户名和角色,但您也可以使用管理面板add custom claims。添加一些声明可能很有用,因为令牌是在每个请求中发送的,您可以从应用程序中对其进行解码。

根本没有用户信息令牌,实际上是endpoint。使用您在第一步中获得的访问令牌访问此端点,通常会提供一个 JSON 响应,其中包含有关用户的详细信息(例如用户数据、角色...)。

【讨论】:

谢谢@Xtreme,同意。但是,使用 Keycloak 我会得到相同的信息。双方。在访问令牌中,我得到以下关于用户的信息: .. "group_membership": [ "/group1" ], "user_attribute": [ "userattribute" ], "preferred_username": "USERNAME", "email": "USERNAME@email.com" 并且来自 UserInfo 端点的响应是 "group_membership": [ "/group1" ], "user_attribute": [ "userattribute" ], "preferred_username": "USERNAME" , "email": "USERNAME@email.com" 这取决于实现(在本例中为 KC)及其配置方式。规范并没有告诉它不能是相同的信息。但显然,正如我上面所说,它们有不同的用途。【参考方案2】:

我设法弄清楚如何在为这两个端点使用 Keyclok 时获取不同的数据:

Keycloak 为“OIDC 令牌和 SAML 断言映射”提供功能,您还可以“控制声明的放置位置”。 通过使用按钮: - 添加到 ID 令牌 - 添加访问令牌 - 添加到用户信息 通过将某些映射器的“添加到 ID 令牌”和“添加到访问令牌”设置为 OFF。 这些将不会包含在 AccessToken 中,因为它们将包含在 UserInfo 响应中。

http://www.keycloak.org/docs/latest/server_admin/index.html#_protocol-mappers

【讨论】:

以上是关于Keycloak 访问令牌与 UserInfo 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 直接访问授权在 keycloak userinfo 端点上无效

Keycloak:访问令牌验证端点

无法访问 Azure 上的 OpenId UserInfo 端点(AADSTS90010:JWT 令牌不能与 UserInfo 端点一起使用)

撤销 Keycloak 访问令牌

Keycloak:使用 keycloak-admin 为用户生成访问令牌

除了 keycloak 令牌之外,我还需要其他任何东西来访问使用 keycloak 保护的服务吗?