如何在Keycloak中使用手机号码对用户进行身份验证

时间:2020-11-11 10:19:35

标签: authentication keycloak openid phone-number keycloak-rest-api

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

有使用用户名和密码来获取令牌的默认方法,但是可以使用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 个答案:

答案 0 :(得分: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 blog post by the developer详细说明实现。

但是,如果您只想使用问题中发布的“ 默认获取方法”,那么您可以做的只是 say 本身必须是手机(类似于WhatsApp的方法),听起来并不那么糟糕,因为1)Keycloak强制要求用户名是唯一的,2)Keycloak仍然具有名字和姓氏字段以按名称标识用户。

现在最棘手的部分是要确保在用户注册期间,用户确实插入了有效的电话号码,而不是一些随机字符串。为此,您可以再次扩展密钥斗篷,并在那里进行验证。但是,如果您要扎根,则最好使用RedHat博客文章中的功能。或使用自己的应用程序管理用户注册,这将依靠某些SMS安全功能来强制用户添加有效的电话号码,并且在执行验证后,应用程序本身将使用以下命令在Keycloak上注册用户:用户名字段设置为用户电话号码。