手机号登录验证流程
- 判断手机号和验证码是否为空
- 判断手机验证码和输入的验证码是否一致
- 判断是否是第一次登录
是:查数据库
否:直接登录
- token验证
第2步和第四步业务复杂(借助第三方)
- 第2步借助阿里云短信服务(或腾讯云,或容联云)
- 第4步借助jwt工具,生成token
115集. 手机登录之token
token是什么?防伪字符串
这里借助jwt生成token。jwt
1. 如何使用?
(1)pom(这里写在了common_util模块) ```xmlio.jsonwebtoken jjwt
(2)config(这里写在了common_util模块)
```java
import 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";
//根据参数生成token
public 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字符串得到用户id
public 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验证
//用户手机号登录接口
@Override
public 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();
}
//如果还是等于null
if(StringUtils.isEmpty(name)) {
//就把手机号赋进去
name = userInfo.getPhone();
}
map.put("name", name);
//这里先不用token
map.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
- 然后修改一些配置,
- 修改代码(重要!)