У меня есть пользователь keycloak с настраиваемыми атрибутами, как показано ниже.

Я использую Reactjs для интерфейса. Я хочу получить настраиваемый атрибут со стороны javascript. Как говорится в этом ответе.
https://stackoverflow.com/a/32890003/2940265
Но я не могу найти, как это сделать на стороне javascript.
Я отлаживал в Chrome, но не могу найти подходящий результат для настраиваемых атрибутов.
Пожалуйста помоги



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я нашел ответ.
Я размещу здесь, потому что кому-то это может пригодиться.
Что ж, вы можете добавить пользовательские атрибуты для пользователя, но вам нужны дополнительные конфигурации, чтобы получить их со стороны javascript. Для удобства новичков я напишу ответ из раздела Добавление клиента на получение атрибута из javascript (в моем случае - react js).
Добавим пользователю настраиваемые атрибуты.
войдите в keycloak и выберите свое царство (если у вас несколько миров, если вы не войдете в царство автоматически)
После этого выберите Пользователи -> Просмотреть всех пользователей Выберите своего пользователя, в моем случае это Алиса Выберите Атрибуты и добавьте настраиваемые атрибуты (в моем случае я добавил вызов настраиваемого атрибута Идентификатор компании, как показано ниже)
Теперь нажмите Сохранить
Теперь нам нужно сопоставить настраиваемый атрибут с нашим клиентом keycloak. Чтобы клиент мог использовать keycloak, у вас должен быть клиент в Клиенты (левая панель) Если у вас нет, вам нужно настроить для этого клиента. В моем случае мой клиент тестовое приложение
Для этого выберите Клиенты -> тестовое приложение -> Картографы Теперь нам нужно создать Mapper. Нажмите Создавать
Для Название заявки на токен вы должны указать свой ключ настраиваемых атрибутов (в моем случае это Идентификатор компании) для простоты, я использую companyId для Имя, префикс роли Realm, имя утверждения токена. Вы должны выбрать Атрибут пользователя в Тип картографа и Нить для Заявить о типе JSON
После этого нажмите Сохранить. Теперь вы можете получить свой собственный атрибут из javascript.
скажем, ваш объект JavaScript keycloak - плащ, вы можете получить companyId с помощью keycloak.
let companyId = keyCloak.idTokenParsed.companyId;
пример кода будет таким, как показано ниже (мой код в response.js)
keyCloak.init({
onLoad: 'login-required'
}).success(authenticated => {
if (authenticated) {
if (hasIn(keyCloak.tokenParsed, 'realm_access')) {
if (keyCloak.tokenParsed.realm_access.roles === []) {
console.info("Error: No roles found in token")
} else {
let companyId = keyCloak.idTokenParsed.companyId;
}
} else {
console.info("Error: Cannot parse token");
}
} else {
console.info("Error: Authentication failed");
}
}).error(e => {
console.info("Error: " + e);
console.info(keyCloak);
});
Надеюсь, кто-нибудь найдет этот ответ полезным, потому что я смог найти ответ для JavaScript. Удачного кодирования :)
Атрибуты можно получить через профиль пользователя:
keycloak = ... // Keycloak instance
keycloak.loadUserProfile().success(function(profile) {
let companyId = profile.attributes.companyId[0];
alert('Company Id: ' + companyId);
}).error(function() {
alert('Failed to load user profile');
});
Каждый атрибут представляет собой массив строк. Поэтому, если у вас нет нескольких идентификаторов компании, массив будет иметь длину 1, а соответствующие данные будут в элементе 0.
Помимо настраиваемых атрибутов, в профиле пользователя доступны следующие элементы:
Привет, кодо, есть ли средство сопоставления для атрибута, который должен возвращаться в значении вместо массива? Например, companyId вместо companyId [0]
Если вы извлекаете атрибут через профиль, как показано в моем ответе, сопоставитель не задействуется. Так что это всегда массив. Вот какова модель данных Keycload. Но я не понимаю, почему это проблема. Если вы хотите получить атрибут по идентификатору или токену доступа, тогда необходим сопоставитель, который добавляет атрибут в качестве значения (вместо массива). Подробности см. В ответе Меноки Ишана.
Это не проблема, просто у меня есть сопоставитель для токена, который возвращает значение, а администратор возвращает массив, что может сбивать с толку. еще спасибо за это.
Привет, Кодо. Не возражаете, если я спрошу, знаете ли вы на это ответ? stackoverflow.com/questions/60300891/…
Как вы думаете, как это связано с этим вопросом?
Нет, это не ссылка, просто интересно, что у вас есть ответ на это.
подскажите, пожалуйста, как получить экземпляр keycloak? Это также доступно в версии 14.x.x или выше?