authentication - 如何在 Keycloak 中使用手机号码对用户进行身份验证
问题描述
用户在 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 中的自定义属性进行身份验证
解决方案
环顾四周后,在我看来,您将无法获得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 仍然具有字段名和姓氏,以通过名称来识别用户。
现在棘手的部分是确保在用户注册期间,用户确实插入了一个有效的电话号码,而不是一些随机字符串。为此,您可以再次扩展密钥斗篷,并在那里对其进行验证。但是,如果您要使用此根目录,则不妨使用 RedHat 博客文章中的功能。或者使用您自己的应用程序管理用户注册,这将强制用户通过依赖某些SMS
安全功能添加有效的电话号码,并且在执行验证后,应用程序本身将在 Keycloak 上注册用户,并将用户名字段设置为用户电话号码。
推荐阅读
- c# - 将类型参数传递给泛型类
- magento - 被“config.platform.php”覆盖的 PHP 版本
- c - Kernel Scheduler(Linux) - 任务是函数吗?
- javascript - 在外部 js 文件中调用时未定义视频 Js
- java - 如何将音频添加到 listView?
- c# - 如何在 Web 表单应用程序中获取最后日期输出?
- hazelcast - Hazelcast IMap getAll 与 getAsync
- vba - 在日期和第三个字段之间过滤 MS Access 表单
- spring-mvc - @RequestParam 动态参数列表作为 Map
- csv - spark csv writer - 转义字符串而不使用引号