【发布时间】:2021-04-19 04:30:29
【问题描述】:
我必须将旧式身份验证系统移至 Keycloak,并且我无法更改客户端上的实际工作流程。因此,我需要为我的 api(在 node.js 中)提供一个用户创建和登录系统,该系统依次代表用户从 Keycloak 创建和获取访问令牌。
我能够创建用户,但我无法找到为该用户生成访问令牌的方法。我找到的唯一解决方法是创建一个用户并设置一个随机密码,然后要求授予用户提供用户名和密码,但这意味着我必须在我身边存储一个密码,这正是我想搬家的原因到钥匙斗篷。
const KcAdminClient = require('keycloak-admin').default;
const Keycloak = require('keycloak-connect');
const _keycloakAdmin = new KcAdminClient({
baseUrl: process.env.KEYCLOAK_SERVER_AUTH_URL,
realm: process.env.KEYCLOAK_REALM
});
await _keycloakAdmin.auth({
realm: process.env.KEYCLOAK_REALM,
username: process.env.KEYCLOAK_USER,
password: process.env.KEYCLOAK_PASSWORD,
grantType: 'password',
clientId: process.env.KEYCLOAK_CLIENT_ID,
});
//Create a user and set password
const newUser = await _keycloakAdmin.users.create({
realm: process.env.KEYCLOAK_REALM,
username: 'something',
email: 'someone@domain.com',
firstName: 'Some',
lastName: 'One',
emailVerified: true,
enabled: true,
});
await _keycloakAdmin.users.resetPassword({
realm: process.env.KEYCLOAK_REALM,
id: newUser.id,
credential: {
temporary: false,
type: 'password',
value: 'randompassword'
}
});
//generate a token for the user
const _keycloak = new Keycloak({}, {
clientId: process.env.KEYCLOAK_CLIENT_ID,
serverUrl: process.env.KEYCLOAK_SERVER_AUTH_URL,
realm: process.env.KEYCLOAK_REALM,
credentials: {
secret: process.env.KEYCLOAK_CLIENT_SECRET
}
});
const grant = await _keycloak.grantManager.obtainDirectly('something', 'randompassword');
const access_token = grant.access_token.token;
我不敢相信没有更优雅的方式来做到这一点,所以我认为我在配置 Keycloak 客户端以及理解一些基本概念和命名约定方面缺少一些基本知识。我本来期望像
await _keycloakAdmin.users.generateAccessToken(userId, realm, clientId, ...)
但我找不到它。我只在这里找到了这个未回答的问题:Keycloak :REST API call to get access token of a user through admin username and password
【问题讨论】:
标签: node.js keycloak keycloak-rest-api