用户登录的几种认证方式

原创
01/17 18:17
阅读数 657

基于验证码登录

1.检查验证码

数据库建一个存储验证码的表,img_code,它的字段包括:

1.1获取验证码

提供获取验证码接口,给前端使用。

有相关的验证码生成工具包和类,配置验证码规则,比如验证码长度、大写字母、小写字母、符号、数字组合,是否可重复等规则。

生成验证码和uuid,入库,并返回前端。

1.2保存验证码

当生成新的验证码和uuid时,存入数据库。并返回给前端。

1.3校验验证码

当有用户登录时,除了用户的登录信息外,需要回传验证码的uuid和code。

用回传的uuid查询验证码的表,是否能查询到记录,比较查询结果的code是否一致。

还要检查当前请求的时间和验证码生成时间是否超过了我们设置的时间,比如三分钟,超过了则验证码无效。

用户登录时还要求回传用户的ip和设备id,如果前端用户没有回传验证码uuid和code,则需查询用户最后一次登录的ip和设备id与本次登录是否相同,相同则不需要验证码。不同则必须要提交验证码。

1.4删除无效验证码

1.可以通过自动定时任务,在凌晨删除过期验证码。过期时间自己定,比如早于当前系统时间,过期一天的就是无效的,过期三小时就是无效等等。

2.还有一种很LOW的方式,就是在每次获取验证码的时候,判断当前系统时间是否为凌晨时间段,如果是,则删除无效验证码。

2.检查用户是否被锁定

通过验证码后,需要查询用户登录记录表,里面存储着用户的每次登录信息,我们最关注的是用户最近一次登录信息。

判断用户账号是否被锁定,登录失败次数是否超过限制,和最后一次登录时间,如果失败次数超过了限制,我们可以根据设置的限制(比如15分钟后再登录)时间,系统当前时间和最后一次登录时间,三者关系,来告知用户多少分之后才可以再次登录。

3.最后进行账号密码正确性校验

通过登录限制,最后进行账号密码正确性检查。

 

基于手机号短信登录

数据库创建一个存储基于短信或邮箱验证码的表,用于存储信息。

1.获取短信接口

1.根据入参手机号,查询该用户,此种类型的短信,是否有大于未使用短信验证码限制数(比如10条),如果大于,则提示该用户超出了短信当天最大次数,不再发送短信验证码。

2.生成随机验证码内容,保存进数据库。

2.组装短信

拼装短信对象,调用本公司系统的短信服务的接口,由短信服务组装第三方短信模板,保存进数据库表,形成待发送短信的队列。

3.发送短信

另外再启动一个自动任务,设置时间间隔,不停地查询短信队列表,调用第三方付费短信接口,发送短信。

4.短信验证码登录

用户输入验证码点击登录,携带验证码到服务单,先检查验证码是否存在,是否未使用,是否过期。

然后校验用户名密码是否正确。

 

基于微信授权登录

创建微信授权表

用户使用微信授权登录,微信平台会调用我们的controller层接口,传递微信参数到我们接口。字段如下:

private String nickname;
private String openid;
private String unionid;
private String headimgurl;
private String accessToken;
private String refreshToken;
private String platform;
private String device_id;

我们通过unionid字段,查询微信授权表,判断我们是否绑定了我系统账号,可以用手机号或者我方账号做关联关系。

如果未绑定,则登录失败。

如果已绑定,则更新微信授权表信息。

根据授权表记录中的账号,查询我方会员表信息。

成功,则保存用户登录记录。

保存授权登录记录。

基于二维码登录

1.什么是二维码

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。----来自百度百科

在商品上,一般都会有条形码,条形码也称为一维码,条形码只能表示一串数字。二维码要比条形码丰富很多,可以存储数字、字符串、图片、文件等,比如我们可以把 www.baidu.com 存储在二维码中,扫码二维码我们就可以获取到百度的地址。

2.移动端基于Token的认证机制

在了解扫码登录原理之前,有必要先了解移动端基于 token 的认证机制,对理解扫码登录原理还是非常有帮助的。基于 token 的认证机制跟我们常用的账号密码认证方式有较大的不同,安全系数比账号密码要高,如果每次验证都传入账号密码,那么被劫持的概率就变大了。

基于 token 的认证机制流程图,如下图所示

基于 token 的认证机制,只有在第一次使用需要输入账号密码,后续使用将不在输入账号密码。「其实在登陆的时候不仅传入账号、密码,还传入了手机的设备信息。在服务端验证账号、密码正确后,服务端会做两件事」

第一,将账号与设备关联起来,在某种意义上,设备信息就代表着账号。

第二,生成一个 token 令牌,并且在 token 与账号、设备关联,类似于key/value,token 作为 key ,账号、设备信息作为value,持久化在磁盘上。

将 token 返回给移动端,移动端将 token 存入在本地,往后移动端都通过 token 访问服务端 API ,当然除了 token 之外,还需要携带设备信息,因为 token 可能会被劫持。带上设备信息之后,就算 token 被劫持也没有关系,因为设备信息是唯一的。

这就是基于 token 的认证机制,将账号密码换成了 token、设备信息,从而提高了安全系数,可别小看这个 token ,token 是身份凭证,在扫码登录的时候也会用到。

3.二维码扫码登录原理

好了,知道了移动端基于 token 的认证机制后,接下来就进入我们的主题:二维码扫码登陆的原理。先上二维码扫码登录的流程图:

扫码登录可以分为三个阶段:「待扫描、已扫描待确认、已确认」。我们就一一来看看这三个阶段。

「1、待扫描阶段」

待扫描阶段也就是流程图中 1~5 阶段,即生成二维码阶段,这个阶段跟移动端没有关系,是 PC 端跟服务端的交互过程。

首先 PC 端携带设备信息向服务端发起生成二维码请求,服务端会生成唯一的二维码 ID,你可以理解为 UUID,并且将 二维码 ID 跟 PC 设备信息关联起来,这跟移动端登录有点相似。

PC 端接受到二维码 ID 之后,将二维码 ID 以二维码的形式展示,等待移动端扫码。此时在 PC 端会启动一个定时器,轮询查询二维码的状态。「如果移动端未扫描的话,那么一段时间后二维码将会失效。」

「2、已扫描待确认阶段」流程图中第 6 ~ 10 阶段,我们在 PC 端登录微信时,手机扫码后,PC 端的二维码会变成已扫码,请在手机端确认。这个阶段是移动端跟服务端交互的过程。

首先移动端扫描二维码,获取二维码 ID,「然后将手机端登录的信息凭证(token)和 二维码 ID 作为参数发送给服务端」,此时的手机一定是登录的,不存在没登录的情况。

服务端接受请求后,会将 token 与二维码 ID 关联,为什么需要关联呢?你想想,我们使用微信时,移动端退出, PC 端是不是也需要退出,这个关联就有点把子作用了。然后会「生成一个一次性 token,这个 token 会返回给移动端,一次性 token 用作确认时候的凭证」

PC 端的定时器,会轮询到二维码的状态已经发生变化,会将 PC 端的二维码更新为已扫描,请确认。

「3、已确认」

流程图中的 第 11 ~ 15 步骤,这是扫码登录的最后阶段,移动端携带上一步骤中获取的临时 token ,确认登录,「服务端校对完成后,会更新二维码状态,并且给 PC 端生成一个正式的 token ,后续 PC 端就是持有这个 token 访问服务端」

PC 端的定时器,轮询到了二维码状态为登录状态,并且会获取到了生成的 token ,完成登录,后续访问都基于 token 完成。

在服务器端会跟手机端一样,维护着 token 跟二维码、PC 设备信息、账号等信息,后续的认证也是基于 token 和设备信息来完成。

到此,二维码扫描登录原理就差不多了,二维码扫描登录在原理上不难理解,跟 OAuth2.0 有一丝的相似之处,但是实现起来可能就比较复杂。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部