Как аутентифицировать пользователя с использованием номера мобильного телефона в Keycloak

#authentication #keycloak #openid #phone-number #keycloak-rest-api

#аутентификация #keycloak #OpenID #номер телефона #keycloak-rest-api

Вопрос:

Пользователь имеет пользовательский атрибут PhoneNumber в Keycloak.

Существует метод по умолчанию для получения токена с использованием имени пользователя и пароля, но можно ли пройти аутентификацию с использованием PhoneNumber / password вместо имени пользователя / пароля

 curl 
  -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" 
  -d "username=$UNAME" -d "password=$PASSWORD" 
  -d "grant_type=password" 
  "$KEYCLOAKHOST/auth/realms/$REALM/protocol/openid-connect/token"
  

Какой вызов я должен использовать для аутентификации с использованием пользовательского атрибута в UserModel

Ответ №1:

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

 curl 
  -d "client_id=$CLIENT_ID" -d "client_secret=$CLIENT_SECRET" 
  -d "phoneNumber=$PhoneNumber" -d "password=$PASSWORD" 
  -d "grant_type=password" 
  "$KEYCLOAKHOST/auth/realms/$REALM/protocol/openid-connect/token"
  

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

Таким образом, вы можете попытаться расширить Keycloak эту функциональность, что недавно было сделано в производственной среде. К счастью, разработчик был достаточно любезен, чтобы предоставить эту функциональность для реализации другими, проверьте это сообщение в блоге redhat от разработчика с подробным описанием реализации.

Однако, если вы хотите использовать только «метод выборки по умолчанию«, который вы опубликовали в вопросе, то, что вы можете сделать, это просто сказать, что само имя пользователя должно быть мобильным телефоном (аналогично подходу WhatsApp), что не так плохо, как кажется, потому что 1) Keycloakобеспечивает уникальность имен пользователей, 2) Keycloak по-прежнему содержит поля имя и фамилия для идентификации пользователей по имени.

Теперь самое сложное — убедиться, что во время регистрации пользователя пользователь действительно вставляет действительный номер телефона, а не какую-то случайную строку. Для этого вы можете либо снова расширить keycloak, либо проверить его там. Однако, если вы используете этот root, вы также можете использовать функцию из сообщения в блоге RedHat. Или управляйте регистрацией пользователя с помощью собственного приложения, которое заставит пользователя добавлять действительный номер телефона, полагаясь на некоторые SMS функции безопасности, а после выполнения проверки само приложение зарегистрирует пользователя в Keycloak, указав в поле имя пользователя номер телефона пользователя.