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

问题描述 投票:0回答:1

用户在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 中的自定义属性进行身份验证

authentication keycloak openid phone-number keycloak-rest-api
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 博客文章] 1 详细介绍了实现。

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

现在棘手的部分是确保在用户注册期间,用户确实插入了有效的电话号码,而不是一些随机字符串。为此,您可以扩展 keycloak 并在那里验证它。但是,如果您要走这条路,您不妨使用 RedHat 博客文章中的功能。或者使用您自己的应用程序管理用户注册,这将强制用户依靠某些短信安全功能添加有效的电话号码,并且在执行验证后,应用程序本身将在设置了用户名字段的 Keycloak 上注册用户到用户的电话号码。

© www.soinside.com 2019 - 2024. All rights reserved.