首页 » 互联通信 » 一文搞懂用户登录验证流程(附图),token2049新加坡。

一文搞懂用户登录验证流程(附图),token2049新加坡。

金螳螂建筑装饰股份通讯 2024-09-19 0

扫一扫用手机浏览

文章目录 [+]

结合网关干系知识食用更佳

业务图解

对付用户登录来说、涉及到了用户注册、登录验证几个方面,通过流程图演示如何处理(新用户/老用户)登录

一文搞懂用户登录验证流程(附图) 一文搞懂用户登录验证流程(附图) 互联通信

一文搞懂用户登录验证流程(附图) 一文搞懂用户登录验证流程(附图) 互联通信
(图片来自网络侵删)
流程解读客户端-登录界面(常日手机验证码登录) 1.填写手机号 2.发送验证码 3.填写验证码 4.勾选新用户自动注册做事端-用户验证 1.验证账号验证码是否精确 2.验证用户是否存在(不存在出初始化用户信息) 3.完成验证天生token 4.将token返回给客户端用户信息设计

字段

描述

类型

是否唯一

telephone

手机号

varchar

nickname

昵称

varchar

根据业务决定是否可重复

account

账号

varchar

password

密码

varchar

create_time

创建韶光

datetime

modify_time

修正韶光

datetime

...省略小程序授权码等等、根据自身业务进行增加

验证流程图解

登录验证流程涉及到了两个接口,两个缓存。
1.获取验证码接口,给手机号发送验证码并设置验证码缓存,设置过期韶光;2.登录接口,提比武机号及验证码,读取缓存进行匹配验证,成功则天生token返回给客户端,客户端登录成功,登录后要求头携带token进行业务要求即可。

关于token过期韶光

常日我们token的过期韶光是根据客户真个类型来定义的,app的过期韶光会更长一些(常日一个星期),web端过期韶光以小时为单位,如果掌握过期韶光可以将web登录和app登录拆分为两个接口(能够分流,接口压力更小),或者是根据要求头信息进行判断即可,是移动端就设置7天,是web端就设置两小时。

关于业务要求token验证

登录成功后,客户端每次要求都会携带token,常日我们会有一个网关来进行token验证,网关用于登录验证的核心便是登录成功后写入的token作为key,值为用户根本信息的缓存,图解如下:

验证成功后,重写内部要求头,将用户的的id,账号,昵称信息放入要求头中,这样可以方便业务系统获取当前操浸染户信息以及权限掌握等等

关于登出操作

用户携带token要求登出接口,登出接口对token对应的缓存进行删除操作,返回401即可,客户端获取到401就会跳转到登录页面

关于匿名要求(免登录)

常日匿名要求放行有两种方案,1.授权token,为token设置单位韶光内要求次数;2.配置路径放行规则,对要求接口路径进行正则匹配,符合正则规则的进行放行

方案1:授权token,限定单位韶光要求次数

优点便是虽然是免登录接口,但是接口的操为难刁难象可以追溯,要求次数可控,避免被造孽利用;缺陷便是须要更多的编码及配置事情

技能实现1.供应一个授权token管理页面,紧张管理token利用者,token的值,单位韶光访问次数(如每分钟60次)2.增编削查,将授权token存放到缓存中,利用map进行存储,key为token,值为每分钟访问次数3.单位韶光计数缓存,过期韶光为1分钟

这时候我们须要在上面的验证流程图根本上进行升级

要求次数检讨代码实现

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Component;import java.util.concurrent.TimeUnit;/ 授权token要求限定缓存 @author 热黄油啤酒 @since 2021-11-01 /@Componentpublic class AuthTokenRequestLimitCache { @Autowired private RedisTemplate<String, Integer> redisTemplate; private static final String AUTH_TOKEN_LIMIT_KEY_PREFIX = "auth_token_limit"; / 要求次数+1并检讨是否超限 @param token @return 是否放行 / public boolean incrementWithCheck(String token) { // 1.获取token要求次数限定,获取为null代表授权配置已被修正,此token已经不具备权限 Integer limit = getLimit(token); if (limit == null) { return false; } // 2.组装缓存key,读取缓存 String key = String.join(":", AUTH_TOKEN_LIMIT_KEY_PREFIX, token); Integer count = redisTemplate.opsForValue().get(key); // 3.没有值代表一分钟内没有要求产生了 if (count == null) { // 初始化值 redisTemplate.opsForValue().increment(key); // 设置过期韶光 redisTemplate.expire(key, 1L, TimeUnit.MINUTES); return true; } // 自增并获取当前值 大于限定的话 返回false 网关过滤器返回提示信息(如要求过于频繁) Long inc = redisTemplate.opsForValue().increment(key); return inc <= limit; } / 获取限值 @param token @return / public Integer getLimit(String token) { Object limit = redisTemplate.opsForHash().get("auth_token_limit", token); return limit == null ? null : (Integer) limit; }}复制代码

对付授权接口,常日是只许可get操作,对数据进行提交或者更新是不被许可的,当然这个是业务层面的,终极取决于系统设计

方案2:要求路径正则校验

我们在网关的配置文件中增加匿名接口规则,要求到网关时,检讨要求的路径是否符合匿名接口规则,是则放行,不是则进行token校验,方案比较大略,只须要对网关进行处理即可。

关于黑名单

对付一个别系来说,黑名单是末了一道关卡,所以为了安全我们须要对问题用户进行黑名单操作,详细实现也比较大略

1.用户管理页面供应一个拉黑的按钮,拉黑后,这些用户的id会存储到一个set凑集中去2.登录时候检讨用户是否在黑名单中,是则谢绝登录并提示3.如果用户已经登录后进行拉黑操作,网关会在鉴权通过后检讨用户是否在黑名单中,是则删除token对应缓存,返回401,401就会跳到登录页,步骤2就会进行拦截。
总结

用户系统是非常根本的系统,但是很多程序员事情中可能并没有真正的参与到用户系统的开拓,通过此文可以对用户登录流程及配套功能有一个全面的理解。

链接:https://juejin.cn/post/7025768845075808286

标签:

相关文章

莱芜安装监控,海市蜃楼,歌曲。

莱芜车牌号是鲁什么莱芜是山东省的一个城市,车牌号是鲁。山东省的车牌号前两位都是鲁,代表山东这个省份。莱芜市的车牌号通常是以鲁A开头...

互联通信 2024-09-18 阅读1 评论0