验证码服务返回token--token在接口中的使用

发布时间 2023-12-15 11:00:28作者: 爱豆技术部

验证码服务返回token

// 传入手机号 xxxx ,返回验证码 xxx

// 并且将验证码存入 redis

// 根据用户传入的验证码 ,返回前端token

//传入手机号passengerPhone
public ResponseResult generatorCode(String passengerPhone){
       // 返回 6位数的验证码 serviceVefifcationcodeClient.getNumberCode(6);
       ResponseResult<NumberCodeResponse> numberCodeRespons = serviceVefifcationcodeClient.getNumberCode(6);
       // code 验证码
       int code = numberCodeRespons.getData().getNumberCode();
       System.out.println("调用验证码服务获取验证码 code = " + code);



       // 设置 redis key值
       String key = generatorKeyByPhone(passengerPhone);
       System.out.println("存入redis中key"+key);
       //存入 redis,设置key 手机号,过期时间2分钟
       stringRedisTemplate.opsForValue().set(key,code+"",2, TimeUnit.MINUTES);

// 传入手机号 xxxx ,返回验证码 xxx
       return ResponseResult.success("将验证码存入redis"+code);
  }


// 根据前端传入的,手机号,验证码 ,返回前端token
public ResponseResult checkCode(String passengerPhone,String verificationCode){

       System.out.println("获取手机号 = " + passengerPhone+";验证码 = "+verificationCode);

       // 读取redis存入的 验证码

       // 获取 key值
       String key = generatorKeyByPhone(passengerPhone);
       System.out.println("传入生成key"+key);
       //根据 key值获取value 值
       String codeRedis = stringRedisTemplate.opsForValue().get(key);
       System.out.println("获取redis中的value值 = " + codeRedis);
       //校验验证码 - redis中验证码过期
       if(StringUtils.isEmpty(codeRedis)){
           return ResponseResult.fail(CommonStatusEnum.VERIFICTION_CODE_ERROR.getCode(),CommonStatusEnum.VERIFICTION_CODE_ERROR.getValue());
      }
       //校验验证码 - redis中验证码不符
       if(!(codeRedis.trim()).equals(verificationCode.trim())){  // Stirng中的trim()方法的作用就是去掉字符串前面和后面的空格
           return ResponseResult.fail(CommonStatusEnum.VERIFICTION_CODE_ERROR.getCode(),CommonStatusEnum.VERIFICTION_CODE_ERROR.getValue());
      }

       // 判断是否有用户 并进行处理 (对手机信息进行存储)
       VerificationCodeDTO verificationCodeDTO = new VerificationCodeDTO();
       verificationCodeDTO.setPassengerPhone(passengerPhone);
       servicePassengerUserClient.loginOrRegister(verificationCodeDTO);

       // 颁发 token 令牌 JwtUtil.genertorToken
       String token = JwtUtil.genertorToken(passengerPhone, IdentityConstant.PASSENGER_IDENTITY);

       TokenResponse tokenResponse = new TokenResponse();
       tokenResponse.setToken(token);
       return ResponseResult.success(tokenResponse);
  }



-----方法调用描述
@FeignClient("service-verificationcode")
public interface ServiceVefifcationcodeClient {
   @RequestMapping(method = RequestMethod.GET,value = "/numberCode/{size}") // 这里会调用 serviceverificationcode controller的路径api,返回验证码
   ResponseResult <NumberCodeResponse> getNumberCode(@PathVariable("size") int size);
}

@GetMapping("numberCode/{size}")
   public ResponseResult  numberCode (@PathVariable("size") int size){

       System.out.println("size = " + size);

       /**
        * 获取size位数的随机验证码
        *
        * 0.12345;当要4位数的验证码,*10 的3次方 Math.pow(10,size-1)
        * Math.random()*9+1 防止永远 0 开始
         */
       double random = (Math.random()*9+1)*(Math.pow(10,size-1));
       int num = (int) random;
       System.out.println("num = " + num);


       NumberCodeResponse numberCodeResponse = new NumberCodeResponse();
       numberCodeResponse.setNumberCode(num);
       System.out.println(numberCodeResponse);
       返回验证码
       return ResponseResult.success(numberCodeResponse);

  }


public class JwtUtil {

   // 盐
   private static final String SIGN = "CPE!@#";

   private static final String JWT_KEY = "phone";

   //
   private static final String JWT_KEY_IDENTITY = "identity";

   public static String genertorToken(String passengerPhone,String identity){
       HashMap<String, String> map = new HashMap<>();
       map.put(JWT_KEY, passengerPhone);
       map.put(JWT_KEY_IDENTITY, identity);
       // 设置 token 过期时间 1 天
       Calendar calendar = Calendar.getInstance();
       calendar.add(Calendar.DATE,1);
       Date date = calendar.getTime();
       JWTCreator.Builder builder = JWT.create();

       // 将 token 进行遍历 方到 map 中
       map.forEach(
              (k,v) ->{
                   builder.withClaim(k,v);
              }
      );

       // 整合 过期时间
       builder.withExpiresAt(date);

       // 生成 token
       String sign = builder.sign(Algorithm.HMAC256(SIGN));



       return sign;
  }

   //解析token
   public static TokenResult parseToken(String token){
       DecodedJWT verify = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);

       String phone = verify.getClaim(JWT_KEY).toString();
       String identity = verify.getClaim(JWT_KEY_IDENTITY).toString();
       TokenResult tokenResult = new TokenResult(phone,identity);
       return tokenResult;
  }

   public static void main(String[] args) {

       // 传入 号码,返回token
       String token = genertorToken("18822100030","1");
       System.out.println("token = " + token);
       // 将token 解析 生成原数据
       TokenResult tokenResult = parseToken(token);
       System.out.println("手机 = " + tokenResult.getPhone()+";身份 =" +tokenResult.getIdentity());

  }
}

public class IdentityConstant {
   // 乘客认证
   public static final String PASSENGER_IDENTITY = "1";
   // 司机认证
   public static final String DIRVER_IDENTITY = "2";
}