@adatechnology/keycloak-admin

中文文档
1.0.1发布于 2026/09/17MITTypeScriptES Module零依赖近 30 天下载 2584

Agnostic Keycloak Admin API client authenticated as a service account (client_credentials)

原始使用文档
文档目录4 节
  1. Uso
  2. Token
  3. Injeção
  4. Erros

@adatechnology/keycloak-admin

Cliente do Keycloak Admin API autenticado como service account (client_credentials). Agnóstico de framework e de runtime: só depende de fetch e de zod.

Diferença deliberada para o @adatechnology/nestjs-keycloak-admin: aquele obtém token com grant_type=password usando o usuário administrador do realm master. Este nunca envia senha nem usuário — a identidade é do client confidencial, com manage-users do realm-management.

Uso

import { createKeycloakAdminClient } from '@adatechnology/keycloak-admin'

const keycloak = createKeycloakAdminClient({
  config: {
    baseUrl: process.env.KEYCLOAK_URL,
    clientId: process.env.KEYCLOAK_ADMIN_CLIENT_ID,
    clientSecret: process.env.KEYCLOAK_ADMIN_CLIENT_SECRET,
    realm: process.env.KEYCLOAK_REALM,
  },
})

const { id } = await keycloak.createUser({
  attributes: { company_id: companyId },
  email: '[email protected]',
  enabled: true,
  firstName: 'Ada',
  lastName: 'Lovelace',
  password: { temporary: false, value: chosenPassword },
  username: '[email protected]',
})

Operações de usuário: createUser, findUserByEmail, listUsers, updateUser, setEnabled, updateAttributes, deleteUser, setPassword, setTemporaryPassword.

⚠️ updateAttributes e setProfilePicture leem a conta antes de gravar (GET + PUT da representação completa). O Keycloak 26 com perfil de usuário declarativo trata o PUT com attributes como a ficha inteira: só { attributes } responde 400 "User name is missing", e { username, attributes } apaga e-mail e nome. updateAttributes substitui o conjunto de atributos; setProfilePicture troca só o picture. updateUser e setEnabled seguem parciais, sem leitura.

Foto de perfil: setProfilePicture({ userId, pictureUrl }). O atributo é picture, o nome que o OIDC reserva — com um mapeador no realm ele chega ao token, e a tela desenha o avatar sem uma consulta por pessoa.

⚠️ O Keycloak não hospeda imagem: o valor é uma URL e o arquivo é do produto. Base64 no atributo cresce o token até ele parar de caber no cabeçalho, e o sintoma aparece longe — login que funciona no navegador e falha no curl. A operação lê os atributos antes de gravar, porque o Admin API substitui o conjunto: mandar só a foto apagaria company_id e o resto.

Operações de grupo: createGroup, updateGroup, deleteGroup, listGroups, addUserToGroup, removeUserFromGroup. Só o primeiro nível — grupo aninhado muda o significado de "pertencer", porque quem está no filho herda o pai, e um produto que não modela hierarquia não deve criá-la por acidente. A filiação é endereçada pelo usuário (/users/{id}/groups/{id}), não pelo grupo.

listUsers({ first, limit, search }) devolve { users, hasMore }. O realm não informa total, então a página pede um registro a mais que o limite e descarta-o: é assim que hasMore sai sem uma segunda chamada.

Token

Obtido sob demanda, guardado em memória e renovado 30s antes de expirar (KEYCLOAK_ADMIN_TOKEN_RENEWAL_SKEW_MS). Chamadas concorrentes compartilham a mesma requisição em voo — o Keycloak recebe uma, não N.

Injeção

fetch e now são injetáveis, o que torna rede e relógio observáveis em teste:

createKeycloakAdminClient({ config, fetch: stubFetch, now: clock.now })

Erros

Toda falha vira KeycloakAdminError com code estável (KEYCLOAK_ADMIN_ERROR_CODE), status e context. O contexto é montado por allowlist e passa por um redator que substitui clientSecret, access token e senha por [REDACTED] — nem a mensagem nem o erro serializado carregam segredo.

Configuração inválida falha na construção do cliente, com o caminho do campo no contexto e nunca o valor.

版本与发布记录

@adatechnology/keycloak-admin 共发布 22 个版本,首次发布于 2026/05/06;过去 12 个月发布了 22 个版本。

版本发布日期距今
1.0.1latest2026/09/171 个月前
1.0.02026/09/022 个月前
1.0.0-rc.3rc2026/08/312 个月前
1.0.0-rc.22026/08/312 个月前
1.0.0-rc.12026/08/302 个月前
1.0.0-rc.02026/08/043 个月前

关于 @adatechnology/keycloak-admin 的常见问题

@adatechnology/keycloak-admin 是什么?

Agnostic Keycloak Admin API client authenticated as a service account (client_credentials)

如何安装 @adatechnology/keycloak-admin?

在项目目录运行 npm install @adatechnology/keycloak-admin,或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖:zod(^3.24.1 || ^4.0.0)。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖,Yarn 需要手动安装。

@adatechnology/keycloak-admin 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@adatechnology/keycloak-admin 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@adatechnology/keycloak-admin 可以商用吗?

@adatechnology/keycloak-admin 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@adatechnology/keycloak-admin 的下载量有多少?

根据 npm 官方下载统计,@adatechnology/keycloak-admin 在 2026/10/05 – 2026/11/03 这 30 天内被下载 2,584 次,日均约 86 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@adatechnology/keycloak-admin 还在维护吗?

最新版本 1.0.1 发布于 2026/09/17(1 个月前);至今共发布 22 个版本,其中过去 12 个月发布了 22 个;首次发布于 2026/05/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。