手机号登录验证流程
- 判断手机号和验证码是否为空
- 判断手机验证码和输入的验证码是否一致
- 判断是否是第一次登录
是:查数据库
否:直接登录
- token验证
第2步和第四步业务复杂(借助第三方)
- 第2步借助阿里云短信服务(或腾讯云,或容联云)
- 第4步借助jwt工具,生成token
115集. 手机登录之token
token是什么?防伪字符串
这里借助jwt生成token。jwt
1. 如何使用?
(1)pom(这里写在了common_util模块) ```xmlio.jsonwebtoken jjwt
(2)config(这里写在了common_util模块)```javaimport io.jsonwebtoken.*;import org.springframework.util.StringUtils;import java.util.Date;public class JwtHelper {//过期时间private static long tokenExpiration = 24*60*60*1000;//签名秘钥private static String tokenSignKey = "123456";//根据参数生成tokenpublic static String createToken(Long userId, String userName) {String token = Jwts.builder().setSubject("YYGH-USER").setExpiration(new Date(System.currentTimeMillis() + tokenExpiration)).claim("userId", userId).claim("userName", userName).signWith(SignatureAlgorithm.HS512, tokenSignKey).compressWith(CompressionCodecs.GZIP).compact();return token;}//根据token字符串得到用户idpublic static Long getUserId(String token) {if(StringUtils.isEmpty(token)) return null;Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims claims = claimsJws.getBody();Integer userId = (Integer)claims.get("userId");return userId.longValue();}//根据token字符串得到用户名称public static String getUserName(String token) {if(StringUtils.isEmpty(token)) return "";Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);Claims claims = claimsJws.getBody();return (String)claims.get("userName");}public static void main(String[] args) {String token = JwtHelper.createToken(1L, "lucy");System.out.println(token);System.out.println(JwtHelper.getUserId(token));System.out.println(JwtHelper.getUserName(token));}}
2. 测试
代码:
1. contorller层(这里写到api包中了)
//用户手机号登录接口@PostMapping("login")public Result login(@RequestBody LoginVo loginVo) {Map<String,Object> info = userInfoService.loginUser(loginVo);return Result.ok(info);}
2. service
1.0 版本——没有短信验证,没有token验证
//用户手机号登录接口@Overridepublic Map<String, Object> loginUser(LoginVo loginVo){// 1. 判断手机号和验证码是否为空String phone = loginVo.getPhone();String code = loginVo.getCode();if(StringUtils.isEmpty(phone) ||StringUtils.isEmpty(code)) {throw new YyghException(ResultCodeEnum.PARAM_ERROR);}// 2. 判断手机验证码和输入的验证码是否一致// 3. 判断是否是第一次登录// 是:查数据库// 否:直接登录//手机号已被使用QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("phone", phone);//如何查到了,就查到了。没查到,就自己加UserInfo userInfo = baseMapper.selectOne(queryWrapper);if(null == userInfo) {userInfo = new UserInfo();userInfo.setName("");userInfo.setPhone(phone);userInfo.setStatus(1);this.save(userInfo);}//这里还有个校验,校验是否被禁用(if(userInfo.getStatus() == 0) {throw new YyghException(ResultCodeEnum.LOGIN_DISABLED_ERROR);}//4. token验证Map<String, Object> map = new HashMap<>();String name = userInfo.getName();if(StringUtils.isEmpty(name)) {//昵称name = userInfo.getNickName();}//如果还是等于nullif(StringUtils.isEmpty(name)) {//就把手机号赋进去name = userInfo.getPhone();}map.put("name", name);//这里先不用tokenmap.put("token", "");return map;}
swagger2测试
2.0 版本——没有短信验证,有token验证
修改serviceimp
public Map<String, Object> loginUser(LoginVo loginVo) {…………//jwt生成token字符串String token = JwtHelper.createToken(userInfo.getId(), name);map.put("token",token);return map;}
swagger2测试:
3.0 版本——有短信验证,有token验证

116. 整合阿里云短信验证服务
这里根据阿里云短信验证进行整改!改成容联云短信服务/或腾讯云服务
- 短信服务提供了什么?
api接口
- 需要我们做什么?
阿里云
步骤:
- 申请签名,模板
- 单独创建模块(service-msm)
- pom
- yml
- 映射yml中内容到代码中
- 代码调用api,发送短信,验证码
==========
这里做了redis业务,将每次发送的验证码存入redis中,一个手机号对应一个验证码。
所以我说没有必要!
腾讯云
容联云
别人整合容联云的代码:
后台代码:https://gitee.com/kimbenzhou/yygh_parent.git
前台代码:https://gitee.com/kimbenzhou/yygh_admin.git
demo:文章:https://blog.csdn.net/yu2875592987/article/details/118080959
我是如何操作的?
我直接复制了别人的代码。。。
步骤:
- 容联云注册账号


(无需上线)

- 复制代码:https://gitee.com/kimbenzhou/yygh_parent.git
- 然后修改一些配置,
- 修改代码(重要!)


