文章目录
- 账密登录
- 短信验证码登录
- 扫码登录
- 平台间认证
- 微信一键登录(APP)
- 微信小程序登录
- 三方账号登录
- 手机号一键登录
- 生物识别登录
账密登录
- 参数(账号、密码、登录终端编号)校验,密码正则校验
- 获取请求头看请求是否携带该账号token
- 若请求头携带
该账号
的有效token则直接响应该token
- 若请求头携带
- 查询当前账号是否处于黑名单
- 查询缓存中账号认证失败次数是否超出上限
- 获取当前账号信息
- 判断账号状态是否正常
- 比对账密是否正确 ,若错误直接新增缓存中该账号认证失败次数
- 一定时间内认证失败次数达到上限则生成冻结记录
- 判断该账号是否已存在token
- 无,则签发token,并关联当前终端
- 有,则将当前终端关联到该token
- 将账号基本信息放入缓存
- 异步生成认证记录
- 清空认证失败次数
- 响应token
短信验证码登录
发送短信验证码
- 手机号正则检验
- 判断是否频繁发送(如一分钟内只能发送一次)
- 判断是否超过当日最高次数限制
- 随机生成六位数验证码
String validCode = String.valueOf(ThreadLocalRandom.current().nextInt(100000, 999999));
- 同步调用三方服务发送短信
- 雪花生成业务标识码
- 创建频繁发送标记缓存(如一分钟内只能发送一次)
- 业务标识码拼接验证码,缓存十分钟(十分钟内有效)
- 当日发送次数+1
- 响应业务标识码
验证码登录
- 参数(验证码、业务标识码、手机号、认证系统)有效性校验
- 获取请求头看请求是否携带该账号token
- 若请求头携带
该账号
的有效token则直接响应该token
- 若请求头携带
- 获取/创建账号信息
- 判断账号状态是否正常
- 查询当前账号是否处于黑名单
- 查询缓存中账号认证失败次数是否超出上限
- 判断验证码是否过期
- 判断验证码是否过期 ,若过期直接新增缓存中该账号认证失败次数
- 一定时间内认证失败次数达到上限则生成冻结记录
- 判断该账号是否已存在token
- 无,则签发token,并关联当前终端
- 有,则将当前终端关联到该token
- 将账号基本信息放入缓存
- 异步生成认证记录
- 清空认证失败次数
- 响应token
扫码登录
接口请求获取二维码
- 参数(目标登录终端编号)有效性校验
- 雪花生成二维码标识码
logoCode
- 标识码放入缓存(标识码:登录终端编号)设置过期时间(1min)
redisTemplate.opsForValue().set(logoCode, appId, 1, TimeUnit.MINUTES);
- 响应标识码
PC端页面生成二维码
- 将标识码信息生成二维码
- 轮询调用回调接口
- 通过轮询接口响应状态信息及token判断状态
APP扫码获取信息
- APP扫描PC端二维码获取标识码
APP接口请求锁定二维码
- 调用接口锁定二维码
- 参数(标识码)有效性校验
- 根据标识码新增二维码锁定缓存
redisTemplate.opsForValue().set(“lock_qr_” + logoCode, logoCode, 1, TimeUnit.MINUTES);
App接口请求登录认证
- 参数(标识码)有效性校验
- 通过标识码判断二维码是否过期
Integer cacheAppId = redisTemplate.opsForValue().get(logoCode);
- 若未过期则续期为一分钟(防止授权完成前过期)
redisTemplate.opsForValue().set(logoCode, cacheAppId, 1, TimeUnit.MINUTES);
- 请求头中获取token,判断是否过期/有效
- 判断终端编码(appId)是否已关联过token
- 未关联:进行关联、异步写入认证记录
- 新增token缓存
redisTemplate.opsForValue().set(cacheAppId + logoCode, token, 1, TimeUnit.MINUTES);
- 清除二维码缓存及二维码锁定缓存
redisTemplate.delete(logoCode);
redisTemplate.delete(“lock_qr_” + logoCode);
回调接口响应token
- 入参(登录终端编码、二维码标识码)有效性校验
- 判断二维码标识缓存是否过期(过期返回过期状态提示前端重新获取二维码)
Integer cacheAppId = redisTemplate.opsForValue().get(logoCode);
- 判断二维码锁定缓存是否存在(存在则返回前端锁定状态,PC页面信息更新为尽快确认登录)
String token = redisTemplate.opsForValue().get(appId + logoCode);
- 判断token缓存是否存在(存在则返回授权成功状态并一并返回token)
String qrLock = redisTemplate.opsForValue().get(“lock_qr_” + logoCode);
平台间认证
接口请求后端认证
- 参数(登录终端编码)有效性校验
- 获取请求头token并校验有效性
- 判断终端编码是否已关联过token
- 未关联:进行关联、异步写入认证记录、响应token
- 已关联:响应token
前端路由访问
- 携带后端认证接口响应的token直接跳转到目标终端页面
微信一键登录(APP)
-
没啥好说的官方教程
-
注意,从文档中第二步才是后端该做的(AppID和AppSecret也得后端操心去催)
-
大体流程
/** * 通过code参数加上AppID和AppSecret等,通过API换取access_token * https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code */ /** * 刷新或续期access_token * https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN */ // 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作 // 通过openid获取用户信息(系统用户信息应关联此字段) // 走正常系统登录认证流程
微信小程序登录
-
也是现成套路就不多赘述了,官方教程
-
也就是获取access_token调用的地址和微信一键登录的不一致
/** * 通过code参数加上AppID和AppSecret等,通过API换取access_token * GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code */
三方账号登录
- 和微信登录差不多,关键也是系统账号关联一个三方的openid
- 只不过三方账号代为登录时,在请求登录时就直接传入了openid
- 系统通过openid去查询/创建该系统账号,然后走后续认证流程(参考账密登录获取到用户信息后的后续操作)签发token
手机号一键登录
收费的,一次三毛还是三分来着。所以除了三网官方的App其他应用提供此能力的不多(京东那样的狗大户还有一些想获取你信息的不正经软件除外哈)
信息配置官方教程
前端接入官方教程
后端接入官方教程
- 用户请求登录时通过App应用(通俗讲就是前端/移动端)中内嵌的三方SDK来采集用户手机号码
- 页面提示用户是否一键登录
- 用户同意授权后请求三方SDK获取token(此时token为三方服务签发并非应用服务token)
- 此时调用应用服务端授权(传入三方服务签发的token)
- 调用三方SDK提供的token校验接口
- token认证通过后会返回加密后的手机号
- 通过检验后通过手机号获取系统账号信息
- 后续参考账密登录获取到账号信息后的流程
生物识别登录
就简单介绍下吧,这个太过简单了。
- 前端引用三方组件库,通过用户指纹、面部等生物信息获得一个识别码(类似微信的openid)
- 将识别码以参数形式传递给应用服务端,用用服务端通过识别码获取关联的系统账号信息
- 后续步骤参考账密登录获取到账号信息后的流程