如何在Keycloak中使用手机号码进行用户认证

3

用户在Keycloak中有一个自定义属性phoneNumber。

默认情况下,可以使用用户名和密码获取令牌,但是否可以使用手机号码/密码进行身份验证,而不是使用用户名/密码呢?

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个回答

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并在那里进行验证。然而,如果您选择这种方法,您可能也可以使用来自RedHat博客文章的功能。或者使用自己的应用程序管理用户注册,该应用程序将依靠一些SMS安全功能强制用户添加有效的手机号码,并且在执行验证后,应用程序本身将使用用户名字段将用户注册到Keycloak中设置为用户手机号码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接