从 JavaScript 检索自定义属性(使用 Javascript 适配器)Keycloak

Men*_*han 7 javascript reactjs keycloak

我有一个具有如下自定义属性的 keycloak 用户。 keycloak 自定义属性

我使用 Reactjs 作为前端。我想从 javascript 端检索自定义属性。就像这个答案所说的那样。

/sf/answers/2302300241/

但我找不到如何在 javascript 方面做到这一点。

我在 Chrome 中进行了调试,但找不到适合自定义属性的结果。

请帮忙

Men*_*han 10

我找到了答案。

我会在这里发布,因为有人可能会发现它很有用。

好吧,您可以向用户添加自定义属性,但您需要额外的配置才能从 javascript 端检索它。为了初学者的方便,我将编写从添加客户到从 javascript 检索属性的答案(在我的情况下是 react js)。

让我们为用户添加自定义属性。

登录keycloak并选择您的领域(如果您有多个领域,除非您将自动登录领域)

之后选择用户 - >查看所有 用户在我的情况下选择您的用户是爱丽丝 选择属性并添加自定义属性(在我的情况下我添加了自定义属性调用companyId,如下所示)

在此处输入图片说明

现在点击保存

现在我们必须使用我们的 keycloak 客户端映射自定义属性。要前端使用keycloak,您必须在客户端(左侧栏)中有客户端,如果没有,则必须为此配置客户端。就我而言,我的客户是test-app

因此选择Clients -> test-app -> Mappers 现在我们必须创建 Mapper。点击创建

对于令牌声明名称,为了方便起见,您应该提供自定义属性键(在我的情况下是companyId),我使用 companyId 作为名称、领域角色前缀、令牌声明名称。您应该在Mapper TypeString 中选择User Attribute for Claim JSON Type

之后点击保存。现在您可以从 javascript 获取您的自定义属性。

假设您的 keycloak JavaScript 对象是keycloak,您可以使用 keycloak 获取 companyId。

let companyId = keyCloak.idTokenParsed.companyId;
Run Code Online (Sandbox Code Playgroud)

示例代码如下(我在 react.js 中的代码)

keyCloak.init({
    onLoad: 'login-required'
}).success(authenticated => {
    if (authenticated) {
        if (hasIn(keyCloak.tokenParsed, 'realm_access')) {
            if (keyCloak.tokenParsed.realm_access.roles === []) {
                console.log("Error: No roles found in token")
            } else {
                let companyId = keyCloak.idTokenParsed.companyId;
            }
        } else {
            console.log("Error: Cannot parse token");
        }
    } else {
        console.log("Error: Authentication failed");
    }
}).error(e => {
    console.log("Error: " + e);
    console.log(keyCloak);
});
Run Code Online (Sandbox Code Playgroud)

希望有人觉得这个答案有用,因为我可以找到 JavaScript 的答案。快乐编码:)


Cod*_*odo 5

可以通过用户配置文件检索属性:

keycloak = ... // Keycloak instance

keycloak.loadUserProfile().success(function(profile) {
    let companyId = profile.attributes.companyId[0];
    alert('Company Id: ' + companyId);
}).error(function() {
    alert('Failed to load user profile');
});
Run Code Online (Sandbox Code Playgroud)

每个属性都是一个字符串数组。因此,除非您有多个公司 ID,否则数组的长度将为 1,相关数据位于元素 0 中。

除了自定义属性之外,以下元素也可作为用户配置文件的一部分:

  • ID
  • 用户名
  • 电子邮件
  • 已启用
  • 电子邮件已验证
  • 托普
  • 创建时间戳