手机号登录验证流程

  1. 判断手机号和验证码是否为空
  2. 判断手机验证码和输入的验证码是否一致
  3. 判断是否是第一次登录

是:查数据库
否:直接登录

  1. token验证

第2步和第四步业务复杂(借助第三方)

  • 第2步借助阿里云短信服务(或腾讯云,或容联云)
  • 第4步借助jwt工具,生成token

    115集. 手机登录之token

    token是什么?防伪字符串
    这里借助jwt生成token。

    jwt

    1. 如何使用?

    (1)pom(这里写在了common_util模块) ```xml io.jsonwebtoken jjwt
  1. 2config(这里写在了common_util模块)
  2. ```java
  3. import io.jsonwebtoken.*;
  4. import org.springframework.util.StringUtils;
  5. import java.util.Date;
  6. public class JwtHelper {
  7. //过期时间
  8. private static long tokenExpiration = 24*60*60*1000;
  9. //签名秘钥
  10. private static String tokenSignKey = "123456";
  11. //根据参数生成token
  12. public static String createToken(Long userId, String userName) {
  13. String token = Jwts.builder()
  14. .setSubject("YYGH-USER")
  15. .setExpiration(new Date(System.currentTimeMillis() + tokenExpiration))
  16. .claim("userId", userId)
  17. .claim("userName", userName)
  18. .signWith(SignatureAlgorithm.HS512, tokenSignKey)
  19. .compressWith(CompressionCodecs.GZIP)
  20. .compact();
  21. return token;
  22. }
  23. //根据token字符串得到用户id
  24. public static Long getUserId(String token) {
  25. if(StringUtils.isEmpty(token)) return null;
  26. Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
  27. Claims claims = claimsJws.getBody();
  28. Integer userId = (Integer)claims.get("userId");
  29. return userId.longValue();
  30. }
  31. //根据token字符串得到用户名称
  32. public static String getUserName(String token) {
  33. if(StringUtils.isEmpty(token)) return "";
  34. Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);
  35. Claims claims = claimsJws.getBody();
  36. return (String)claims.get("userName");
  37. }
  38. public static void main(String[] args) {
  39. String token = JwtHelper.createToken(1L, "lucy");
  40. System.out.println(token);
  41. System.out.println(JwtHelper.getUserId(token));
  42. System.out.println(JwtHelper.getUserName(token));
  43. }
  44. }

2. 测试

测试代码在配置类中!
image.png

代码:

1. contorller层(这里写到api包中了)

  1. //用户手机号登录接口
  2. @PostMapping("login")
  3. public Result login(@RequestBody LoginVo loginVo) {
  4. Map<String,Object> info = userInfoService.loginUser(loginVo);
  5. return Result.ok(info);
  6. }

2. service

1.0 版本——没有短信验证,没有token验证
  1. //用户手机号登录接口
  2. @Override
  3. public Map<String, Object> loginUser(LoginVo loginVo){
  4. // 1. 判断手机号和验证码是否为空
  5. String phone = loginVo.getPhone();
  6. String code = loginVo.getCode();
  7. if(StringUtils.isEmpty(phone) ||
  8. StringUtils.isEmpty(code)) {
  9. throw new YyghException(ResultCodeEnum.PARAM_ERROR);
  10. }
  11. // 2. 判断手机验证码和输入的验证码是否一致
  12. // 3. 判断是否是第一次登录
  13. // 是:查数据库
  14. // 否:直接登录
  15. //手机号已被使用
  16. QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();
  17. queryWrapper.eq("phone", phone);
  18. //如何查到了,就查到了。没查到,就自己加
  19. UserInfo userInfo = baseMapper.selectOne(queryWrapper);
  20. if(null == userInfo) {
  21. userInfo = new UserInfo();
  22. userInfo.setName("");
  23. userInfo.setPhone(phone);
  24. userInfo.setStatus(1);
  25. this.save(userInfo);
  26. }
  27. //这里还有个校验,校验是否被禁用(
  28. if(userInfo.getStatus() == 0) {
  29. throw new YyghException(ResultCodeEnum.LOGIN_DISABLED_ERROR);
  30. }
  31. //4. token验证
  32. Map<String, Object> map = new HashMap<>();
  33. String name = userInfo.getName();
  34. if(StringUtils.isEmpty(name)) {
  35. //昵称
  36. name = userInfo.getNickName();
  37. }
  38. //如果还是等于null
  39. if(StringUtils.isEmpty(name)) {
  40. //就把手机号赋进去
  41. name = userInfo.getPhone();
  42. }
  43. map.put("name", name);
  44. //这里先不用token
  45. map.put("token", "");
  46. return map;
  47. }

swagger2测试

image.png
只需要code和phone即可
测试成功!
image.png

2.0 版本——没有短信验证,有token验证

修改serviceimp

  1. public Map<String, Object> loginUser(LoginVo loginVo) {
  2. …………
  3. //jwt生成token字符串
  4. String token = JwtHelper.createToken(userInfo.getId(), name);
  5. map.put("token",token);
  6. return map;
  7. }

image.png

swagger2测试:

删掉数据库记录,再来一次!
测试成功!!!

3.0 版本——有短信验证,有token验证

image.png

116. 整合阿里云短信验证服务

这里根据阿里云短信验证进行整改!改成容联云短信服务/或腾讯云服务

  1. 短信服务提供了什么?

api接口

  1. 需要我们做什么?

调用接口

阿里云

步骤:

  1. 申请签名,模板
  2. 单独创建模块(service-msm)
  3. pom
  4. yml
  5. 映射yml中内容到代码中
  6. 代码调用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
我是如何操作的?
我直接复制了别人的代码。。。

步骤:

  1. 容联云注册账号

image.png

image.png
(无需上线)

image.png

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

image.png