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

Posted

技术标签:

【中文标题】如何在 Keycloak 中使用手机号码对用户进行身份验证【英文标题】:How to authenticate user using mobile number in Keycloak 【发布时间】:2021-02-23 07:32:37 【问题描述】:

用户在 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】:

环顾四周后,在我看来,您将无法获得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 详细介绍实现。

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

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

【讨论】:

以上是关于如何在 Keycloak 中使用手机号码对用户进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

可以在 keycloak 中使用基于 SMS 的 OTP 吗?

如何在 Flutter 中使用 KeyCloak

如何使用 keycloak 对 loopback 4 应用程序进行身份验证

如何使用 REST API 在 keycloak 中重置用户密码

如何让我的 Spring Boot 应用程序使用给定的用户名和密码登录到 keycloak?

如何让 Keycloak 验证用户同意?