当前位置: 首页 > 后端技术 > Java

如何实现多账号统一登录?

时间:2023-04-01 14:38:21 Java

来源:www.dustyblog.cn现在几乎大部分的APP都支持第三方多账号登录,比如:微信、QQ、微博等,我们称之为多账号统一登录。这些账户的表设计和流程设计非常重要,否则后续的扩展性会很差。本文不提供任何代码实践,只是根据我司整理博主账号模块设计,提供思路,仅供参考。1、自建登录系统1.1.1手机号登录注册本次设计的思路是每个手机号对应一个用户,手机号是必填项。流程:先输入手机号码,然后发送给服务器。首先判断手机号是否有账号,如果没有,会生成随机验证码,将手机号和验证码绑定到Redis,并设置一定的过期时间(过期时间一般为5分钟,即我们一般的手机号)验证码的有效期),最后通过短信的方式将验证码发送给用户。用户收到验证码后,在界面上填写验证码、密码等基本信息,然后将数据发送给服务器。服务端收到后首先判断Redis中手机号对应的验证码是否相同。如果失败,它会返回一个错误代码。如果成功,它会创建一个帐户并为用户保存密码。注册成功后,用户可以通过手机号+密码登录。问题:用户体验差。您需要获取验证码,填写验证码/密码/用户名等诸多信息完成注册,即可使用;很容易忘记密码。忘记后,只能通过忘记密码的方式重新设置密码。1.1.2优化注册登录本方案思路是弱化强制密码,即无论用户是否注册,都可以直接通过手机号+验证码登录(保留手机号+密码登录方式)。流程:输入手机号,发送给服务器。服务器生成随机验证码,将手机号和验证码绑定到Redis,并设置一定的过期时间(过期时间一般为5分钟,也就是我们一般手机验证码的有效期),最后通过发送给用户的短信发送验证码。用户收到验证码后,只需在界面上填写收到的验证码,提交给服务器即可。服务器收到后,首先判断Redis中手机号对应的验证码是否一致。失败则返回错误码,成功则直接登录。如果是老用户,直接拉取用户信息;如果是新用户,会提示他填写用户信息(非必填)。用户通过手机号+验证码登录后,还可以选择设置密码,即可通过手机号+密码登录,即密码可选。用户表设计:iduser_nameuser_passworduser_mobilestatemore用户id用户名用户密码手机号账户状态其他信息1.2引入第三方账户方案1.2.1微博登录进入Web2.0时代,微博开放了第三方网站登录,产品说,这个我们have是的,可以通过添加微博账号登录我们的App,而且必须关联到我们自己的用户表。流程:客户端调用微博登录接口输入用户名和密码。登录成功后返回access_token,通过access_token调用API接口获取用户信息。服务器通过用户信息在我们的用户表中创建一个账号,以后第三方账号可以直接通过微博账号登录。微博用户信息表设计:iduser_iduidaccess_token主键id用户id微博唯一id授权码1.2.2噩梦降临后,QQ开通用户登录,微信开通用户登录,网易开发用户登录。.....一次访问多个第三方登录,只能根据“微博用户信息表”新建一个表,重写一套各种第三方登录。2、优化账号系统2.1原有账号系统分析自建登录系统:无论是手机号+密码,还是手机号+验证码,都是用户信息+密码的验证方式;第三方登录:也是用户信息+密码的形式,用户信息是第三方系统中的ID(第三方系统中的唯一标识),密码是access_token,就是一个带有a的密码时限和定期修改。2.2新建账户体系2.2.1数据表设计用户基本信息表:idnicknameavatarmore用户id昵称头像其他信息用户授权信息表:iduser_ididentity_typeidentifiercredential主键id用户id登录类型(手机号/邮箱)或第三方应用名称(微信/微博等)手机号/邮箱/第三方唯一标识密码证书(自建账号存储密码,第三方存储token)说明:用户表分为用户基本信息表+用户授权信息表;用户信息表不保存任何密码,不保存任何登录信息(如用户名、手机号、邮箱),只保存昵称、头像等基本信息;所有与授权相关的,都放在用户信息授权表中,用户信息表和用户授权表是一对多的关系。2.2.2登录流程手机号+验证码按照前面的方案。邮箱/手机号+密码:用户填写邮箱/手机号+密码;请求登录时,先判断类型,如手机号登录为例:使用type='phone'结合identifier='手机号'进行查找,如果有,则取出来判断是否是password_hash(password)与入口的凭据匹配,如果匹配则通过验证,然后通过user_id获取用户信息;第三方登录,比如微信登录:querytype='weixin'结合identifier='WeChatopenId',如果有记录则登录成功,更新token;假设与微信服务器的通信没有被劫持,则无需判断凭证问题。2.2.3优缺点优点:可以无限扩展登录类型,显着降低新登录类型的开发成本;原来的情况下,应用需要验证手机号和邮箱是否验证过,需要相应的附加字段如phone_verified和email_verified,现在只要在用户授权信息表中增加一个统一的验证字段即可,每个login方法可以直观的看到是否已经过验证;在用户授权信息表中添加相应的时间和IP地址,可以更完整地追踪用户的使用习惯,例如:两年多没有使用微博登录,绑定微信300天;如果说email地址和手机号码是用户信息的一部分,虽然users表被展开了,但是users表中还有email,phone,只是用来“展示”的,没有必要的与昵称、头像或性别等属性的区别;可以根据需要绑定任意多个同类型的登录方式,即一个用户可以绑定多个微信账号,可以有多个邮箱,可以有多个手机号。当然,你也可以将一种登录方式限制在一条记录中;缺点:当用户同时拥有邮箱、用户名、手机号等多种登录方式时,修改密码时必须同时更改,否则会变成邮箱+新密码。手机号+旧密码都能登录,一定是很奇怪的情况;代码量增加,某些情况下逻辑判断增加,难度增加;例如,无论用户是否登录,无论用户是否注册,都点击同一个链接进入微博,经过第三方授权后返回。可能有几种情况:微博没有在本站注册过,很好,直接注册关联他就可以登录了;本站微博已存在,当前用户未登录,直接登录成功;微博未在本站注册,但当前用户已登录并关联了其他微博账号,如何处理取决于是否允许绑定多个微博账号;本站未注册微博,当前用户已登录,尝试绑定;微博已经注册了,用户已经登录了这个账号,为什么还要重复绑定自己?本站已有微博,但当前用户已经登录并关联了其他微博账号,怎么办?3、一键登录3.1背景回顾手机号+验证码登录方式:输入手机号,等待验证码短信,输入验证码,点击登录。整个过程可能需要20多秒,操作比较繁琐;它依赖于短信网络,因为如果你收不到短信,你将无法登录。从安全的角度来看,也存在验证码泄露的风险。如果有人知道你的手机号,盗取了验证码,也可以登录你的账号。但是退一步想想,我们为什么要验证码呢?验证码的作用是确认手机号是你的,那么除了用短信,还有什么其他的方式可以验证手机号吗?如果可以获取到当前使用的手机号码,则可以验证用户输入的号码。但出于安全考虑,客户端无法直接获取手机号码,运营商可以通过SIM卡数据进行查询。现在运营商已经开放了相关能力,我们可以在用户输入手机号码后调用运营商的接口判断用户输入的手机号码是否与本地号码一致。这样一来,用户省去了等待验证码短信和输入验证码的过程,并且不受短信网络的限制,简化了登录流程。但是我们再进一步想,如果运营商可以直接将当前号码返回给我们,而不是仅仅为了验证,那么用户甚至不需要填写手机号码。这就是本节的亮点:一键登录。3.2本地号码认证获取当前手机使用的手机卡号,直接使用该卡号登录,即一键登录。这种登录方式的好处是显而易见的。可以更方便快捷地完成注册和登录过程,将原本需要20秒的过程缩短到2秒左右,大大提升用户登录体验。主要步骤如下:SDK初始化:调用SDK初始化方法,传入平台项目的AppKey和AppSecret。调用授权页面:调用SDK调用授权接口。SDK会先向运营商发起请求,获取手机号的验证码。请求成功后,会跳转到授权页面。授权页面会显示手机号码掩码和运营商协议,供用户确认。同意授权并登录:用户同意相关协议,在授权页面点击登录按钮,SDK会请求获取本次取号的token,请求成功后将token返回给客户端。获取号码:将获取到的token发送到我们自己的服务器,服务器会携带token调用运营商的一键登录接口,调用成功返回手机号码。服务器使用手机号登录或注册,并将操作结果返回给客户端,完成一键登录。4.总结从博主的角度来看,没有最好的方案,选择适合当前系统的设计即可。不要深究哪一个更好或更坏。鞋子合不合脚,只有脚知道。近期热点文章推荐:1.1,000+Java面试题及答案(2021最新版)2.别在满屏的if/else中,试试策略模式,真的很好吃!!3.操!Java中xx≠null的新语法是什么?4、SpringBoot2.5发布,深色模式太炸了!5.《Java开发手册(嵩山版)》最新发布,赶快下载吧!感觉不错,别忘了点赞+转发!