我想为我的用户提供 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)
}
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)
| 归档时间: |
|
| 查看次数: |
4020 次 |
| 最近记录: |