Вычислить атрибут клиента Keycloak с помощью scriptMapper - PullRequest
0 голосов
/ 29 мая 2019

Я использую Keycloak в качестве поставщика подключения Open ID, Я хочу подключить свой экземпляр keycloak к сервису через OpenId. Но для этих сервисов требуется информация о пользователе, чтобы предоставить числовой идентификатор (который не предоставляет keycloak). Я подумал, что мог бы использовать скрипт-маппер для этой задачи, взять внутренний идентификатор ключа плаща (uuid) и сгенерировать из него числовой идентификатор.

Предполагается, что средство отображения сценариев принимает javascript, но нет документации и площадки, которые бы помогли мне отладить результаты.

Этот фрагмент кода работает, но мне не удается получить результат в моей информации о пользователе.

var id = user.Id.replace(/-/g, '').substring(0,10);
var fake_id = parseInt(id, 16);
fake_id

Этот код принят, но я не могу его отладить. когда я пытаюсь return fake_id; я получаю ошибку: Invalid return statement return fake_id;

Спасибо за вашу помощь!

1 Ответ

1 голос
/ 03 июня 2019

Ваш код почти хорош. Я проверял это на Keycloak 6.0.1. Однако есть несколько вещей, которые вы должны проверить и принять во внимание:

  1. JS-сценарий не должен явно содержать оператор return. Его последнее утверждение принимается как возвращаемое значение. В Keylcoak 6.0.1 добавление явного возврата приводит к ошибке валидации.

  2. Убедитесь, что у вас включена функция «Добавить в userinfo», как показано на рисунке ниже:

enter image description here

Примечание. Для проверки можно также включить «Добавить в токен доступа». В этом случае вы можете просто запросить токен доступа, используя полномочия для предоставления пароля владельца ресурса, и проверить, работает ли маппер должным образом.

  1. В вашем коде JS необходимо изменить несколько вещей:
    • при синтаксическом анализе int на основе 10 символов полученное число должно быть слишком большим, чтобы его можно было проанализировать как int. Я получил инт, когда я люблю это до 6 символов
    • используйте Math.floor () для полученного числа, чтобы быть уверенным, что это будет int. Странно, но я обнаружил, что даже простой parseInt("10") дает Double, а не Integer. Я считаю, что это особенность Nashorn (Javascript Engine, который использует Keycloak)

var id = user.id.replace(/-/g, '').substring(0,6);
var fake_id = parseInt(id, 16);
Math.floor(fake_id);

После добавления картографа я получил идентификатор, например 14401067, при запросе на auth/realms/example/protocol/openid-connect/token конечной точке (я делаю запросы, используя Бессонница , у него хорошая поддержка Auth, поэтому вы можете запросить напрямую /userinfo конечная точка, если хотите - Insomnia позаботится о том, чтобы сначала запросил токен доступа.

При написании такого маппера вы получаете целое число на основе UUID. Однако, подумав, это не идеальный подход - он не гарантирует вам уникальности. Это потому, что мы сокращаем UUID, который является 128-битным значением, до целого. Как следствие, могут быть столкновения. Если ваша система сильно полагается на уникальность этого идентификатора, вам следует пересмотреть свой подход. Конечно, можно явно установить атрибут пользователя, но это требует ручного управления, поэтому это может быть невозможным.

...