我想向我的用户提供指向KC中注册过程的链接,而不是他们必须通过“登录”页面并点击链接。(最终,我想在链接中提供他们的user_id,但这是另一个问题:-))
似乎我无法直接链接到:
/auth/realms/my-relm/login-actions/registration?client_id=my-client&tab_id=D92kNju2J1M
[看起来KC需要启动'会话'并将tab_id附加到URL。
我尝试使用此链接:
/auth/realms/my-realm/protocol/openid-connect/registrations?response_type=code&client_id=my-client&login=true&scope=openid
我在使用SAML时收到“错误协议”错误。
有人知道该怎么做吗?
谢谢,斯图尔特
这是一个很老的问题,但是它可以帮助其他人,因为Keycloak并未提供用于用户注册的专用API,所以我使用admin api来完成这项工作。这就是我设法从客户端应用创建用户的方式。
import querystring from "querystring";
....
....
const adminCredential = () => {
return querystring.stringify({
username: process.env.KEYCLOAK_ADMIN_USERNAME,
password: process.env.KEYCLOAK_ADMIN_PASSWORD,
client_id: process.env.KEYCLOAK_ADMMIN_CLIENT_ID,
grant_type: "password"
});
};
export const createUserHandler = async (userParams, callback) => {
const keycloakParams = {
username: userParams.username,
email: userParams.email,
lastName: userParams.lastName,
firstName: userParams.firstName,
emailVerified: false,
enabled: false,
attributes: {
country: userParams.country,
phoneVerified: false,
emailVerificationCode: randomSixDigitNumber(),
userRole: "user",
avatarUrl
},
credentials: [
{
type: "password",
value: userParams.password,
temporary: false
}
]
};
try {
const {
data: { access_token }
} = await KCAuthRestClient(adminCredential());
const { code, data, status } = await KCUserCreateRestClient({
access_token,
data: keycloakParams
});
} catch (error) {
console.error(error)
}
const axios = require('axios');
const { KEYCLOAK_URL } = require("../API");
export const KCUserCreateRestClient = async ({ data, access_token }) => {
const url = `${KEYCLOAK_URL}/auth/admin/realms/${REALM}/users`
const config = {
headers: {
Authorization: `Bearer ${access_token}`
}
};
try {
const response = await axios.post(url, data, config);
const userId = response.headers.location.split(`${url}/`)[1]
return await {
code: response.status,
status: response.statusText,
data: { id: userId }
}
} catch (error) {
return {
statusCode: error.response.status,
status: error.response.statusText
}
}
}