1. 首页
  2. > 香港公司注册 >

企业信息填报登录验证码有限制吗(企业信息填报验证码咋收不到)

前言

本文通过图示及代码的方式介绍用户登录流程及技术实现,内容包括用户登录,用户验证,如何获取操作用户的信息以及一些黑名单及匿名接口如何免验证相关的实现。


结合网关相关知识食用更佳



流程解读

  • 客户端-登录界面(通常手机验证码登录) 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请求登出接口,登出接口对to收ken对应的缓存进行删除操作,返回401即可,客户端获取到401就会跳转到登录页面


关于匿名请求(免登录)

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


方案1:授权token,限制单位时间请求次数

优点就是虽然是免登录接口,但是接口的操作对象可以追溯,请求次数可控,避免被非法利用;缺点就是需要更多的编码及配置工作


技术实现

  • 1.提供一个授权token管理页面,主要管理token使用者,token的值,单位时间访问次数(如每分钟60次)
  • 2.增删有限制改查,将授权token存放到缓存中,使用map进行存储,key为token,值为每分钟访问次数
  • 3.单位时间计数缓存,过期时间为1分钟

这时候我们需要在上面的验证流程图基础上进行升级



请求次数检查代码实现

import org.spri企业信息ngframework.beans.factory.annotation.Autowired; import org.springfra吗mework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import java.util.concurrent.TimeUnit; /** * 授权token请求限制缓存 * * @author 热黄油啤酒 * @since 2021-11-01 */ @Compo验证nent public class AuthTokenRequestLimitCache { @Autowired private RedisTemplate<String, Integer> redisTemplate; private static final String AUTH_TOKEN_LIMIT_KEY_PREFIX = "auth_toke吗n_limit"; /** * 请求次数 1并检查是否超限 * * @param token 码咋 * @return 是否放行 */ pub码咋lic boolean incrementWithC有限制heck(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校验,方案比较简单,只需要对网关进行处理即可。


关于黑名单

对于一个系统来说,黑名单是最后一道关卡,所以为了安全我们需要对问题用户进行黑名单操作,具体实现也比较简单



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


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息