Keycloak是否提供用户注册API来从客户端应用程序注册用户?

Sta*_*Rat 5 keycloak

我想为我的用户提供 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 时,出现“协议错误”错误。

有人知道怎么做这个吗?

谢谢,斯图尔特

Aat*_*thi 3

这是一个相当老的问题,但它可以帮助其他人,因为 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)
    }
Run Code Online (Sandbox Code Playgroud)
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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)