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

问题描述 投票:2回答:1

我想向我的用户提供指向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
1个回答
0
投票

这是一个很老的问题,但是它可以帮助其他人,因为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
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.