技术方案:
项目结构:
项目概述
通过接口文档(API文档)定义规范
开发工具安装与配置
Linux虚拟机
YAPI
账号 tanhua@itcast.cn 密码123456
安装个安卓模拟器,然后安装APK
开发环境说明
初始工程搭建
阿里云短信-组件抽取
需求分析-表结构
JWT-概述
JSON Web token简称JWT, 是用于对应用程序上的用户进行身份验证的标记。也就是说, 使用 JWTS 的应用程序不再需要保存有关其用户的 cookie 或其他session数据。此特性便于可伸缩性, 同时保证应用程序的安全。
JWT-内部结构
JWT-鉴权流程
public class JwtTest { @Test public void testCreateToken() { //生成token //1、准备数据 Map map = new HashMap(); map.put("id",1); map.put("mobile","13800138000"); //2、使用JWT的工具类生成token long now = System.currentTimeMillis(); String token = Jwts.builder() .signWith(SignatureAlgorithm.HS512, "itcast") //指定加密算法 .setClaims(map) //写入数据 .setExpiration(new Date(now + 30000)) //失效时间 .compact(); System.out.println(token); } //解析token /** * SignatureException : token不合法 * ExpiredJwtException:token已过期 */ @Test public void testParseToken() { String token = "eyJhbGciOiJIUzUxMiJ9.eyJtb2JpbGUiOiIxMzgwMDEzODAwMCIsImlkIjoxLCJleHAiOjE2MTgzOTcxOTV9.2lQiovogL5tJa0px4NC-DW7zwHFqZuwhnL0HPAZunieGphqnMPduMZ5TtH_mxDrgfiskyAP63d8wzfwAj-MIVw";//这里的token是上一个测试方法生成的token try { Claims claims = Jwts.parser() .setSigningKey("itcast") .parseClaimsJws(token) .getBody(); Object id = claims.get("id"); Object mobile = claims.get("mobile"); System.out.println(id + "--" + mobile); }catch (ExpiredJwtException e) { System.out.println("token已过期"); }catch (SignatureException e) { System.out.println("token不合法"); } } }
/** * 检验登录 */ @PostMapping("/loginVerification") public ResponseEntity loginVerification(@RequestBody Map map) { //1、调用map集合获取请求参数 String phone = (String) map.get("phone"); String code = (String) map.get("verificationCode"); //2、调用userService完成用户登录 Map retMap = userService.loginVerification(phone,code); //3、构造返回 return ResponseEntity.ok(retMap); }
service:
/** * 验证登录 * @param phone * @param code */ public Map loginVerification(String phone, String code) { //1、从redis中获取下发的验证码 String redisCode = redisTemplate.opsForValue().get("CHECK_CODE_" + phone); //2、对验证码进行校验(验证码是否存在,是否和输入的验证码一致) if(StringUtils.isEmpty(redisCode) || !redisCode.equals(code)) { //验证码无效 throw new RuntimeException("验证码错误"); } //3、删除redis中的验证码 redisTemplate.delete("CHECK_CODE_" + phone); //4、通过手机号码查询用户 User user = userApi.findByMobile(phone); boolean isNew = false; //5、如果用户不存在,创建用户保存到数据库中 if(user == null) { user = new User(); user.setMobile(phone); user.setPassword(DigestUtils.md5Hex("123456")); Long userId = userApi.save(user); user.setId(userId); isNew = true; } //6、通过JWT生成token(存入id和手机号码) Map tokenMap = new HashMap(); tokenMap.put("id",user.getId()); tokenMap.put("mobile",phone); String token = JwtUtils.getToken(tokenMap); //7、构造返回值 Map retMap = new HashMap(); retMap.put("token",token); retMap.put("isNew",isNew); return retMap; }
用户登录代码优化