【问题标题】:Set and update Keycloak/OpenId-Connect Claims in Client application在客户端应用程序中设置和更新 Keycloak/OpenId-Connect 声明
【发布时间】:2020-08-22 01:53:57
【问题描述】:

我想知道是否以及如何设置和更新 Keycloak (OpenID-Connect) AccessTokenIdToken 属性(所谓的声明)由客户端 Web 应用程序,在成功验证后。

该用例是在用户基于 a Vue.js 前端和一个 SpringBoot 后端,主要将 REST 服务暴露给前端。 第二个 Web 应用程序也使用 Keycloak 令牌进行用户身份验证/授权(单点登录功能)应该能够读取第一个 Web 应用程序添加到令牌的用户属性。

即使我担心OpenId-Connect的架构设计不允许添加和更改令牌有效负载,但我仍然希望无论如何都可以。

令牌属性在 OpenId-Connect 中实现为“声明”。 Keycloak 在身份验证过程中支持“Claim”映射(由 Keycloak 服务器上的静态映射以及 Keycloak 服务器上运行的代码设置)。

以下文章提到了设置和获取Claim键值对的适当方法:

How to create a Script Mapper in Keycloak?:

token.getOtherClaims().put("myClaimName", "claim value");

Include user locale to the Keycloak ID token:

Map<String, Object> otherClaims = token.getOtherClaims();
if (otherClaims.containsKey("myClaimName")) {
  String claimValue = String.valueOf(otherClaims.get("myClaimName"));
}

对于架构设计不允许 Keycloak 客户端更改令牌有效负载的情况,我感谢任何关于最佳实践的建议,以将动态添加的用户属性从一个 web 应用程序移交给另一个 web 应用程序,具有相同的 Keycloak 访问和/或 Id-Token 通用。

【问题讨论】:

    标签: spring-boot vue.js spring-security keycloak


    【解决方案1】:

    是的,架构设计不允许/不可能通过用户应用程序更改令牌有效负载。当您更改有效负载时,应用程序不拥有创建正确令牌签名所必需的私钥。

    【讨论】:

    • 谢谢扬!通过调用 token.getOtherClaims().put("myClaimName", "claim value") 方法添加 Token 的 Payload;在客户端应用程序中是可能的(即使不知道/应用私钥),但添加的声明不会传播到同一 Keycloak 领域下的其他客户端。
    • @MajestixFinger 是的,您“可以添加”自定义声明,但您将无法生成正确的签名,因此其他应用程序将使用您的自定义声明拒绝此无效令牌,但签名无效。那么添加索赔有什么意义,什么时候会被拒绝?
    • 我观察到的行为是,其他客户端不会拒绝更改的令牌无效,而是令牌更改似乎不会传播到其他客户端。我想在令牌更改的客户端下只有令牌的本地副本(由 Spring Security 框架生成)。声明添加完成。因此,我认为这就是添加的令牌声明不会被其他客户端看到的原因。
    猜你喜欢
    • 2020-10-14
    • 2021-03-16
    • 2021-01-12
    • 2020-08-19
    • 2020-01-31
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    相关资源
    最近更新 更多