package com.mashibing.apipassenger.service.imp;
import com.alibaba.cloud.commons.lang.StringUtils;
import com.mashibing.apipassenger.remote.ServicePassengerClient;
import com.mashibing.apipassenger.remote.ServiceVerificationCodeClient;
import com.mashibing.apipassenger.service.VerificationCodeService;
import com.mashibing.internalcommon.constant.CommonStatusEnum;
import com.mashibing.internalcommon.constant.IdentityConstants;
import com.mashibing.internalcommon.constant.TokenTypeConstants;
import com.mashibing.internalcommon.dto.ResponseResult;
import com.mashibing.internalcommon.request.VerificationCodeDTO;
import com.mashibing.internalcommon.response.NumberCodeResponse;
import com.mashibing.internalcommon.response.TokenResponse;
import com.mashibing.internalcommon.util.JwtUtils;
import com.mashibing.internalcommon.util.RedisPrefixUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
@Service
@RequiredArgsConstructor
public class VerificationCodeServiceImp implements VerificationCodeService {
/**
* 验证码的生成位数
*/
private static final int NUMBER_CODE_SIZE = 6;
//remote client interface serviceVerificationCode
private final ServiceVerificationCodeClient serviceVerificationCodeClient;
//remote client interface servicePassenger
private final ServicePassengerClient servicePassengerClient;
//StringRedisTemplate
private final StringRedisTemplate stringRedisTemplate;
/**
* 根据手机号生成验证码
* @param passengerPhone 手机号
* @return 验证码信息
*/
@Override
public ResponseResult generatorCode(String passengerPhone) {
/**
* 1.调用远程验证码服务,获取验证码
* 2.存如redis
*/
System.out.println("调用验证码服务,获取验证码");
ResponseResult<NumberCodeResponse> numberCodeResponse = this.serviceVerificationCodeClient.numberCode(NUMBER_CODE_SIZE);
int numberCode = numberCodeResponse.getData().getNumberCode();
System.out.println("remote number code:"+numberCode);
System.out.println("存入redis");
//key,value,过期时间
//1.将对应手机号的作为key,生成的验证码作为value值写入到redis中
String key = RedisPrefixUtils.generatorKey(passengerPhone);
this.stringRedisTemplate.opsForValue().set(key,numberCode+"",2, TimeUnit.MINUTES);
System.out.println("redisKey:"+key);
//2.通过短信服务商将短信发送至客户端
//返回值
return ResponseResult.success();
}
/**
* 根据手机号和验证码进行验证
* @param passengerPhone 手机号
* @param verificationCode 验证码
* @return
*/
@Override
public ResponseResult checkCode(String passengerPhone, String verificationCode) {
/**
* 1.根据手机号查询redis中的手机验证码是否存在
* 2.检验验证码是否是否正确
* 3.判断用户是否登录 调用 passenger-user服务进行登录或注册
* 4.颁发令牌
*/
/**
* 1.生成key
* 2.获取value
*/
String key = RedisPrefixUtils.generatorKey(passengerPhone);
String codeRedis = this.stringRedisTemplate.opsForValue().get(key);
System.out.println("redis中的value:"+codeRedis);
System.out.println("检验验证码是否是否正确");
if(StringUtils.isBlank(codeRedis)){
return ResponseResult.fail(CommonStatusEnum.VERIFICATION_CODE_ERROR.getCode(), CommonStatusEnum.VERIFICATION_CODE_ERROR.getValue());
}
if(!codeRedis.trim().equals(verificationCode.trim())){
return ResponseResult.fail(CommonStatusEnum.VERIFICATION_CODE_ERROR.getCode(), CommonStatusEnum.VERIFICATION_CODE_ERROR.getValue());
}
System.out.println("判断用户是否登录");
VerificationCodeDTO verificationCodeDTO = new VerificationCodeDTO();
verificationCodeDTO.setPassengerPhone(passengerPhone);
ResponseResult responseResult = this.servicePassengerClient.loginOrRegister(verificationCodeDTO);
System.out.println("颁发令牌");
/**
* 双token的检验
*
* accessToken 成功的token每次都会检验该token
* refreshToken 刷新使用的token在accessToken失效之后使用
* refreshToken 要比accessToken时常要比accessToken稍微长一些
*
*/
String accessToken = JwtUtils.generatorToken(passengerPhone, IdentityConstants.PASSENGER_PHONE,TokenTypeConstants.ACCESS_TOKEN_TYPE);
String refreshToken = JwtUtils.generatorToken(passengerPhone, IdentityConstants.PASSENGER_PHONE,TokenTypeConstants.REFRESH_TOKEN_TYPE);
/**
* 根据身份标识和tokenType生成tokenRedisKey,将数据保存在redis
*/
String accessTokenKey = RedisPrefixUtils.generatorTokenKey(passengerPhone, IdentityConstants.PASSENGER_PHONE,TokenTypeConstants.ACCESS_TOKEN_TYPE);
String refreshTokenKey = RedisPrefixUtils.generatorTokenKey(passengerPhone, IdentityConstants.PASSENGER_PHONE,TokenTypeConstants.REFRESH_TOKEN_TYPE);
this.stringRedisTemplate.opsForValue().set(accessTokenKey,accessToken,30,TimeUnit.DAYS);
this.stringRedisTemplate.opsForValue().set(refreshTokenKey,refreshToken,31,TimeUnit.DAYS);
// this.stringRedisTemplate.opsForValue().set(accessTokenKey,accessToken,10,TimeUnit.SECONDS);
// this.stringRedisTemplate.opsForValue().set(refreshTokenKey,refreshToken,30,TimeUnit.SECONDS);
TokenResponse tokenResponse = new TokenResponse();
tokenResponse.setAccessToken(accessToken);
tokenResponse.setRefreshToken(refreshToken);
return ResponseResult.success(tokenResponse);
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
网约车项目-online-taxi-public.zip
共40个文件
java:32个
xml:5个
yaml:3个
需积分: 0 0 下载量 54 浏览量
2023-11-06
23:07:46
上传
评论
收藏 40KB ZIP 举报
温馨提示
网约车项目-online-taxi-public
资源推荐
资源详情
资源评论
收起资源包目录
网约车项目-online-taxi-public.zip (40个子文件)
online-taxi-public-master
api-passenger
pom.xml 2KB
src
main
resources
application.yaml 223B
java
com
mashibing
apipassenger
controller
VerificationCodeController.java 1KB
TokenController.java 882B
TestController.java 626B
service
TokenService.java 273B
imp
VerificationCodeServiceImp.java 6KB
TokenServiceImp.java 3KB
VerificationCodeService.java 583B
ApiPassengerApplication.java 574B
remote
ServicePassengerClient.java 646B
ServiceVerificationCodeClient.java 661B
interceptor
JwtInterceptorConfig.java 1KB
JwtInterceptor.java 3KB
pom.xml 3KB
service-verificationcode
pom.xml 1KB
src
main
resources
application.yaml 151B
java
com
mashibing
serviceverificationcode
controller
TestController.java 330B
NumberCodeController.java 943B
ServiceVerificationCodeApplication.java 465B
service-passenger-user
pom.xml 1KB
src
main
resources
application.yaml 402B
java
com
mashibing
servicepassengeruser
controller
TestController.java 327B
UserController.java 910B
dao
mapper
PassengerUserMapper.java 318B
entity
PassengerUser.java 1KB
ServicePassengerUserApplication.java 588B
service
UserService.java 386B
imp
UserServiceImp.java 2KB
internal-common
pom.xml 520B
src
main
java
com
mashibing
internalcommon
constant
TokenTypeConstants.java 321B
CommonStatusEnum.java 788B
IdentityConstants.java 272B
response
NumberCodeResponse.java 140B
TokenResponse.java 305B
request
VerificationCodeDTO.java 256B
dto
TokenResult.java 290B
ResponseResult.java 2KB
util
RedisPrefixUtils.java 909B
JwtUtils.java 3KB
共 40 条
- 1
资源评论
武昌库里写JAVA
- 粉丝: 3422
- 资源: 1986
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功