首次代理登录流程
First Broker Login Flow
这是在看 Keycloak 的文档时,学到的一个词,不知道怎么翻译,就先叫“首次代理登录流程”吧。
解决什么问题
在前面的视频里,我分享了一个关于手机短信验证码登录的安全问题,并以某跨国巨头的网站为例,使用自己的手机号,却登录了别人的账号。
同时,也用实例展示了国内大厂的应对策略。总之,就是通过直观的感性的认知,带大家了解了为什么短信验证码直接登录不安全,以及正确的做法是怎样的。
今天,参考 Keycloak 文档,从理性的逻辑的角度,来系统地分析和阐述解决方案。
首次登录流程
当一个用户通过身份代理人登录一个系统时,其部分用户信息被导入或者链接到了该系统的本地数据库。如果这个身份代理人是外部的,比如移动运营商,那么用户的手机号就被导入或者链接到了系统的本地数据库。
这时会碰到两种情况:
系统识别出已经有了一个被导入过和链接过的用户账号,其手机号和当前登录人的手机号一样。这时系统认为当前登录人就是系统中的用户,直接授权并进入系统。
系统识别出当前登录的外部用户没有被导入或者链接过。这时一般你只需要注册并导入这个新账号到本地数据库即可,但是如果数据库中已经有了一个账号的手机号和当前登录人的手机号一样该怎么办?自动链接已有的本地账号到外部身份提供者会是一个潜在的安全漏洞,因为你不能总是相信你从外部身份提供者那里获取到的信息(这也是以上视频展示的情况)。
以上第二种情况就是账号冲突现象,不同的组织在处理账号冲突时有不同的要求。因此在 Keycloak 的身份提供者配置中心,提供了一个叫做“首次登录流程”的选项,让你来选择一个当用户第一次从外部身份提供者登录时的工作流。它默认使用“首次代理人登录”工作流,但是你也可以配置使用自己不同的工作流。
在 Keycloak 中,流程可以在管理员控制台中的“授权”标签页下配置。当你选择“首次代理人登录”,就会看到默认使用了什么授权器。
首次代理人登录流程
首次代理人登录流程的行为详情如下(虽然翻译自 Keycloak 官方文档,但是可以算是一个通用协议。不同的厂其实有对应的实现):
审核、完善档案资料
授权器会展示档案资料页面,用户可以审核从身份提供者获取到的档案资料。授权器是可配置的,如果被配置成为“在第一次登录时更新资料”,用户就会在展示档案资料的页面被询问更多信息来关联身份。
在某些厂,这可能是一个所谓的“完善个人资料”流程(页面)。
创建用户如果唯一
授权器应该去检查现有的账号,看是否存在已有账号的手机号、邮箱或者用户名与外部身份提供者提供的账号相同。如果没有,则直接创建本地账号,并且在整个流程结束后与外部身份提供者提供的账号信息链接。如果存在这样的本地账号,则进行“处理已有账号”的子流程。
处理已有账号(确认链接已存在的账号)
在这个阶段,用户可以选择创建一个全新的账号,或者通过回答问题证明已有账号是自己的,并且链接至已有账号。
比如我尝试通过自己的新手机号,通过验证码登录百度,就会碰到这样的页面:
通过邮件验证已有账号
除了以上展示的百度的处理方式,还有另外的方式,比如通过发送验证码到已有账号的邮箱,用户需要输入邮箱验证码来确认自己拥有已有的账号。
重新授权已验证已有账号
这个重新验证,可以是 OTP,也可以是使用密码。比如以上百度的处理方式,就是重新使用密码验证。
Keycloak 的实现
详细代码参见: https://github.com/keycloak/keycloak/blob/8e6489459dac322bbc61b6a63b7cb2d5aa9870af/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java