Ваш код почти хорош. Я проверял это на Keycloak 6.0.1.
Однако есть несколько вещей, которые вы должны проверить и принять во внимание:
JS-сценарий не должен явно содержать оператор return
. Его последнее утверждение принимается как возвращаемое значение. В Keylcoak 6.0.1 добавление явного возврата приводит к ошибке валидации.
Убедитесь, что у вас включена функция «Добавить в userinfo», как показано на рисунке ниже:
Примечание. Для проверки можно также включить «Добавить в токен доступа». В этом случае вы можете просто запросить токен доступа, используя полномочия для предоставления пароля владельца ресурса, и проверить, работает ли маппер должным образом.
- В вашем коде 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-битным значением, до целого. Как следствие, могут быть столкновения. Если ваша система сильно полагается на уникальность этого идентификатора, вам следует пересмотреть свой подход. Конечно, можно явно установить атрибут пользователя, но это требует ручного управления, поэтому это может быть невозможным.