当前位置:网站首页>图解用户登录验证流程,写得太好了!
图解用户登录验证流程,写得太好了!
2022-07-27 01:22:00 【肥肥技术宅】
前言
本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现。
业务图解
对于用户登录来说、涉及到了用户注册、登录验证几个方面,通过流程图演示如何处理(新用户/老用户)登录

流程解读
客户端-登录界面(通常手机验证码登录)
填写手机号
发送验证码
填写验证码
勾选新用户自动注册
服务端-用户验证
验证账号验证码是否正确
验证用户是否存在(不存在出初始化用户信息)
另外,搜索公众号顶级算法后台回复“微信”,获取一份惊喜礼包。
完成验证生成token
将token返回给客户端
用户信息设计

验证流程图解

登录验证流程涉及到了两个接口,两个缓存。
获取验证码接口,给手机号发送验证码并设置验证码缓存,设置过期时间;
登录接口,提交手机号及验证码,读取缓存进行匹配验证,成功则生成token返回给客户端,客户端登录成功,登录后请求头携带token进行业务请求即可。
关于token过期时间
通常我们token的过期时间是根据客户端的类型来定义的,app的过期时间会更长一些(通常一个星期),web端过期时间以小时为单位,如果控制过期时间可以将web登录和app登录拆分为两个接口(能够分流,接口压力更小),或者是根据请求头信息进行判断即可,是移动端就设置7天,是web端就设置两小时。
关于业务请求token验证
登录成功后,客户端每次请求都会携带token,通常我们会有一个网关来进行token验证,网关用于登录验证的核心就是登录成功后写入的token作为key,值为用户基础信息的缓存,图解如下:

验证成功后,重写内部请求头,将用户的的id,账号,昵称信息放入请求头中,这样可以方便业务系统获取当前操作用户信息以及权限控制等等。
关于登出操作
用户携带token请求登出接口,登出接口对token对应的缓存进行删除操作,返回401即可,客户端获取到401就会跳转到登录页面
关于匿名请求(免登录)
通常匿名请求放行有两种方案,
授权token,为token设置单位时间内请求次数;
配置路径放行规则,对请求接口路径进行正则匹配,符合正则规则的进行放行
方案1:授权token,限制单位时间请求次数
优点就是虽然是免登录接口,但是接口的操作对象可以追溯,请求次数可控,避免被非法利用;缺点就是需要更多的编码及配置工作。
技术实现
提供一个授权token管理页面,主要管理token使用者,token的值,单位时间访问次数(如每分钟60次)
增删改查,将授权token存放到缓存中,使用map进行存储,key为token,值为每分钟访问次数
单位时间计数缓存,过期时间为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请求限制缓存
*/
@Component
public 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校验,方案比较简单,只需要对网关进行处理即可。
关于黑名单
对于一个系统来说,黑名单是最后一道关卡,所以为了安全我们需要对问题用户进行黑名单操作,具体实现也比较简单
用户管理页面提供一个拉黑的按钮,拉黑后,这些用户的id会存储到一个set集合中去
登录时候检查用户是否在黑名单中,是则拒绝登录并提示
如果用户已经登录后进行拉黑操作,网关会在鉴权通过后检查用户是否在黑名单中,是则删除token对应缓存,返回401,401就会跳到登录页,步骤2就会进行拦截。
总结
用户系统是非常基础的系统,但是很多程序员工作中可能并没有真正的参与到用户系统的开发,通过此文可以对用户登录流程及配套功能有一个全面的了解。
边栏推荐
猜你喜欢

基于GoLang实现API短信网关

Alibaba cloud technology expert Yang Zeqiang: Construction of observability on elastic computing cloud

Boom 3D new 2022 audio enhancement app
Common questions and answers of software testing interview (divergent thinking, interface, performance, concept,)

Okaleido tiger logged into binance NFT on July 27, and has achieved good results in the first round

Portraiture5 new and upgraded leather filter plug-in artifact

CAS部署使用以及登录成功跳转地址

Plato Farm全新玩法,套利ePLATO稳获超高收益

杀毒软件 clamav 的安装和使用

FactoryBean的getObject调用时机
随机推荐
cocos小游戏实战-05-NPC与角色攻击逻辑
Alibaba cloud technology expert Yang Zeqiang: Construction of observability on elastic computing cloud
196. 删除重复的电子邮箱
1.28亿美元!芬兰量子计算公司IQM获世界基金支持
我的爬虫笔记(七) 通过爬虫实现blog访问量+1
Go to export excel form
Abbkine AbFluor 488 细胞凋亡检测试剂盒特点及实验建议
Cs224w fall course - --- 1.1 why graphs?
2649: 段位计算
An error in the fourth edition of the red book?
The EXE compiled by QT is started with administrator privileges
【flask】服务端获取客户端的请求头信息
基于GoLang实现API短信网关
机器学习【Matplotlib】
用最原始的方法纯手工实现常见的 20 个数组方法
196. Delete duplicate email addresses
Compile and use protobuf Library in vs2019
HCIP第十三天笔记
be based on. NETCORE development blog project starblog - (16) some new functions (monitoring / statistics / configuration / initialization)
Okaleido tiger logged into binance NFT on July 27, and has achieved good results in the first round