From b210b114d52bb5c3b5a186123f4bd8fb416cf6cf Mon Sep 17 00:00:00 2001 From: yyb <1416014977@qq.com> Date: Fri, 26 Dec 2025 10:07:49 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=A7=9F=E8=B5=81=E7=B3=BB=E7=BB=9F1.?= =?UTF-8?q?1.0=20=E6=96=B0=E5=A2=9E=E8=B0=B7=E6=AD=8C=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lease/controller/LeaseAuthController.java | 63 +++- .../m2pool/lease/dto/v2/GoogleInfoDto.java | 15 + .../m2pool/lease/mapper/LeaseUserMapper.java | 40 ++- .../com/m2pool/lease/redis/RedisAuthKey.java | 23 ++ .../lease/service/LeaseUserService.java | 52 ++- .../service/impl/LeaseUserServiceImpl.java | 311 +++++++++++++++++- .../com/m2pool/lease/vo/v2/GoogleBindVo.java | 37 +++ .../com/m2pool/lease/vo/v2/GoogleCloseVo.java | 22 ++ .../lease/vo/v2/UserGoogleAuthInfo.java | 23 ++ .../src/main/resources/bootstrap-test.yml | 6 + .../mapper/lease/LeaseUserMapper.xml | 37 ++- 11 files changed, 615 insertions(+), 14 deletions(-) create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/GoogleInfoDto.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleBindVo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleCloseVo.java create mode 100644 m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/UserGoogleAuthInfo.java diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseAuthController.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseAuthController.java index 7f73f95..9cb7653 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseAuthController.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/controller/LeaseAuthController.java @@ -1,20 +1,27 @@ package com.m2pool.lease.controller; +import com.m2pool.common.security.annotation.RequiresLogin; import com.m2pool.lease.annotation.Decrypt; import com.m2pool.lease.annotation.LoginRequired; -import com.m2pool.lease.dto.*; +import com.m2pool.lease.dto.Result; +import com.m2pool.lease.dto.v2.GoogleInfoDto; import com.m2pool.lease.service.LeaseUserService; -import com.m2pool.lease.vo.*; +import com.m2pool.lease.vo.EmailCodeVo; +import com.m2pool.lease.vo.UserLoginVo; +import com.m2pool.lease.vo.UserRegisterVo; +import com.m2pool.lease.vo.v2.GoogleBindVo; +import com.m2pool.lease.vo.v2.GoogleCloseVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; import javax.validation.Valid; import java.util.Map; -import java.util.Objects; /** *

@@ -79,5 +86,51 @@ public class LeaseAuthController { public Result sendUpdatePwdCode(@RequestBody @Valid EmailCodeVo emailCodeVo){ return leaseUserService.sendUpdatePwdCode(emailCodeVo); } + + /*-----------------------------谷歌双重验证接口----------------------------*/ + + @Decrypt + @LoginRequired + @PostMapping("/bindGoogle") + @ApiOperation(value = "绑定开启谷歌验证") + public Result bindGoogle(@RequestBody @Valid GoogleBindVo googleBindVo){ + return leaseUserService.bindGoogle(googleBindVo); + } + + @LoginRequired + @PostMapping("/getBindInfo") + @ApiOperation(value = "获取谷歌验证器安全码和验证码") + public Result getBindInfo(){ + return leaseUserService.getBindInfo(); + + } + + @LoginRequired + @PostMapping("/sendOpenGoogleCode") + @ApiOperation(value = "开启谷歌验证器 发送邮箱验证码") + public Result sendOpenGoogleCode(){ + return leaseUserService.sendOpenGoogleCode(); + + } + + @LoginRequired + @PostMapping("/sendCloseGoogleCode") + @ApiOperation(value = "关闭谷歌验证器 发送邮箱验证码") + public Result sendCloseGoogleCode(){ + return leaseUserService.sendCloseGoogleCode(); + + } + + @LoginRequired + @PostMapping("/closeStepTwo") + @ApiOperation(value = "关闭双重验证") + public Result closeStepTwo(@Valid @RequestBody GoogleCloseVo vo){ + return leaseUserService.closeStepTwo(vo); + + } + + /*-----------------------------谷歌双重验证接口----------------------------*/ + + } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/GoogleInfoDto.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/GoogleInfoDto.java new file mode 100644 index 0000000..25042ed --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/dto/v2/GoogleInfoDto.java @@ -0,0 +1,15 @@ +package com.m2pool.lease.dto.v2; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class GoogleInfoDto implements Serializable { + + /** 谷歌验证码 */ + private String secret; + + /** 二维码 */ + private String img; +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java index 500fc0e..cc00391 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/mapper/LeaseUserMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.m2pool.common.datasource.annotation.GAuth; import com.m2pool.lease.entity.GoogleInfo; import com.m2pool.lease.entity.LeaseUser; +import com.m2pool.lease.vo.v2.UserGoogleAuthInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -17,6 +18,41 @@ import org.apache.ibatis.annotations.Param; */ @Mapper public interface LeaseUserMapper extends BaseMapper { - @GAuth - public GoogleInfo getGoogleInfoByEmail(@Param("email") String email); + /** + * 获取谷歌验证相关信息 + * @param email + * @return + */ + GoogleInfo getGoogleInfoByEmail(@Param("email") String email); + + + /** + * 验证码是否已存在 + * @param secret + * @return + */ + boolean checkSecretIfExist(@Param("secret") String secret); + + + /** + * 获取用户谷歌验证码相关信息(包括密码) + * @param email + * @return + */ + UserGoogleAuthInfo getUserInfoByEmail(@Param("email") String email); + + + /** + * 绑定谷歌验证码 + * @param info + * @return + */ + boolean bingGoogleAuthenticator(@Param("info") UserGoogleAuthInfo info); + + /** + * 关闭谷歌验证码 + * @param info + * @return + */ + boolean closeGoogleAuthenticator(@Param("info") UserGoogleAuthInfo info); } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/redis/RedisAuthKey.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/redis/RedisAuthKey.java index 8ef7985..158b23c 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/redis/RedisAuthKey.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/redis/RedisAuthKey.java @@ -19,6 +19,11 @@ public class RedisAuthKey { private static final String USER_LOGIN_KEY= "user:login"; + + private static final String GOOGLE_OPEN_CODE_KEY= "google:open:code"; + + private static final String GOOGLE_CLOSE_CODE_KEY= "google:close:code"; + /** * 获取登录验证码key * @param email @@ -73,4 +78,22 @@ public class RedisAuthKey { return USER_LOGIN_KEY + ":" + email; } + + /** + * 获取用户谷歌验证码 key + * @param email + * @return + */ + public static String getGoogleOpenCodeKey(String email) { + return GOOGLE_OPEN_CODE_KEY + ":" + email; + } + + /** + * 获取用户谷歌关闭验证码 key + * @param email + * @return + */ + public static String getGoogleCloseCodeKey(String email) { + return GOOGLE_CLOSE_CODE_KEY + ":" + email; + } } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseUserService.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseUserService.java index 392642c..77647f3 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseUserService.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/LeaseUserService.java @@ -2,12 +2,16 @@ package com.m2pool.lease.service; import com.baomidou.mybatisplus.extension.service.IService; import com.m2pool.lease.dto.*; +import com.m2pool.lease.dto.v2.GoogleInfoDto; import com.m2pool.lease.entity.LeaseUser; import com.m2pool.lease.vo.*; +import com.m2pool.lease.vo.v2.GoogleBindVo; +import com.m2pool.lease.vo.v2.GoogleCloseVo; import org.springframework.web.bind.annotation.RequestBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; import java.util.List; import java.util.Map; @@ -21,6 +25,8 @@ import java.util.Map; */ public interface LeaseUserService extends IService { + /*---------------用户权限-----------------------*/ + /** * 用户登录/注册 * @param userLoginVo @@ -74,9 +80,50 @@ public interface LeaseUserService extends IService { */ Result logout(); - //---------------用户权限----------------------- + /*---------------用户权限-----------------------*/ + /*---------------谷歌双重验证-----------------------*/ + + /** + * 绑定谷歌验证码 + * @param googleBindVo + * @return + */ + Result bindGoogle( GoogleBindVo googleBindVo); + + /** + * 获取谷歌验证器安全码和验证码 + * @return + */ + Result getBindInfo(); + + /** + * 发送谷歌验证器邮箱验证码 + * @return + */ + Result sendOpenGoogleCode(); + + + + /** + * 发送关闭谷歌验证 邮箱验证码 + * @return + */ + Result sendCloseGoogleCode(); + + /** + * 关闭双重验证 + * @param vo + * @return + */ + Result closeStepTwo(GoogleCloseVo vo); + + /*---------------谷歌双重验证-----------------------*/ + + + /*---------------用户信息-----------------------*/ + /** * 绑定钱包 * @param chainAndCoinVo @@ -154,4 +201,7 @@ public interface LeaseUserService extends IService { * @return */ String getClientVersion(); + + + /*---------------用户信息-----------------------*/ } diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java index 9d39577..94e90c9 100644 --- a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/service/impl/LeaseUserServiceImpl.java @@ -1,7 +1,6 @@ package com.m2pool.lease.service.impl; -import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -10,14 +9,16 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.m2pool.common.core.Result.R; -import com.m2pool.common.core.exception.ServiceException; import com.m2pool.common.core.text.Convert; import com.m2pool.common.core.utils.CodeUtils; +import com.m2pool.common.core.utils.GoogleAuthenticator; import com.m2pool.common.core.utils.StringUtils; import com.m2pool.common.core.utils.uuid.IdUtils; +import com.m2pool.common.core.web.Result.AjaxResult; import com.m2pool.common.redis.service.RedisService; import com.m2pool.common.security.utils.SecurityUtils; import com.m2pool.lease.dto.*; +import com.m2pool.lease.dto.v2.GoogleInfoDto; import com.m2pool.lease.entity.*; import com.m2pool.lease.exception.AuthException; import com.m2pool.lease.exception.PaymentException; @@ -29,9 +30,14 @@ import com.m2pool.lease.redis.RedisAuthKey; import com.m2pool.lease.service.LeaseUserService; import com.m2pool.lease.utils.*; import com.m2pool.lease.vo.*; +import com.m2pool.lease.vo.v2.GoogleBindVo; +import com.m2pool.lease.vo.v2.GoogleCloseVo; +import com.m2pool.lease.vo.v2.UserGoogleAuthInfo; +import com.m2pool.system.api.entity.EmailCodeEntity; +import com.m2pool.system.api.entity.EmailEntity; import com.m2pool.system.api.entity.EmailTemplateEntity; -import com.m2pool.system.api.entity.SysUser; import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.javamail.JavaMailSenderImpl; @@ -554,6 +560,305 @@ public class LeaseUserServiceImpl extends ServiceImpl bindGoogle(GoogleBindVo googleBindVo) { + // 参数校验 + if (StringUtils.isNull(googleBindVo)){ + return Result.fail("未获取到请求参数"); + } + String email = UserThreadLocal.getUserEmail(); + if(StringUtils.isNull(email)){ + return Result.fail("token解析异常"); + } + // 根据邮箱查询是否已绑定 + UserGoogleAuthInfo info = leaseUserMapper.getUserInfoByEmail(email); + + if(StringUtils.isBlank(info.getSecret())){ + //未绑定 正常走绑定流程 + //校验gcode + boolean gResult = GoogleAuthenticator.checkCode(googleBindVo.getSecret(), + googleBindVo.getGCode(), System.currentTimeMillis()); + if(!gResult){ + return Result.fail("谷歌验证码错误"); + } + //校验邮箱验证码 + String redisKey = RedisAuthKey.getGoogleOpenCodeKey(email); + if(redisService.hasKey(redisKey)){ + + Object o = redisService.getCacheObject(redisKey);//google:email:code + + EmailCodeEntity emailCodeEntity = JSON.parseObject(JSON.toJSONString(o), EmailCodeEntity.class); + + //验证验证码 + if(!googleBindVo.getECode().equals(emailCodeEntity.getEmailCode())){ + return Result.fail("邮箱验证码错误"); + } + }else { + return Result.fail("邮箱验证码 未获取或已过期(有效期10分钟),请重新获取验证码"); + } + + //校验密码 + if (!SecurityUtils.matchesPassword(googleBindVo.getPwd(), info.getPwd())){ + return Result.fail("密码错误"); + } + //入库 + UserGoogleAuthInfo bingInfo = new UserGoogleAuthInfo(); + bingInfo.setSecret(googleBindVo.getSecret()); + bingInfo.setStatus(1); + bingInfo.setEmail(info.getEmail()); + boolean bingResult = leaseUserMapper.bingGoogleAuthenticator(bingInfo); + if(bingResult){ + return Result.success("绑定成功"); + }else { + return Result.fail("请求服务器失败,请重试"); + } + + }else { + if(info.getStatus() == 2){ + return Result.fail("您绑定但是关闭了双重验证,请重新打开"); + }if(info.getStatus() == 1){ + return Result.fail("当前用户已绑定过谷歌登录器"); + }else { + return Result.fail("当前用户已绑定过谷歌登录器."); + } + } + } + + @Override + public Result getBindInfo() { + String email = UserThreadLocal.getUserEmail(); + if(StringUtils.isNull(email)){ + return Result.fail("token解析异常"); + } + GoogleInfo info = leaseUserMapper.getGoogleInfoByEmail(email); + + GoogleInfoDto dto = new GoogleInfoDto(); + if(StringUtils.isBlank(info.getSecret())){ + //生成谷歌验证码 + String secret = GoogleAuthenticator.getSecretKey(); + String qrCodeText = GoogleAuthenticator.getQrCodeText(secret, email, domain); + String img = QrCodeUtils.creatRrCode(qrCodeText, 200, 200); + + boolean ifExist = leaseUserMapper.checkSecretIfExist(secret); + if(ifExist){ + secret = GoogleAuthenticator.getSecretKey(); + qrCodeText = GoogleAuthenticator.getQrCodeText(secret, email, domain); + img = QrCodeUtils.creatRrCode(qrCodeText,200,200); + + ifExist = leaseUserMapper.checkSecretIfExist(secret); + if(ifExist){ + return Result.fail("网络异常,请稍后再试"); + } + } + dto.setSecret(secret); + dto.setImg(img); + + }else { + //数据库已有谷歌验证码 直接返回 + BeanUtils.copyProperties(info,dto); + dto.setImg(QrCodeUtils.creatRrCode( GoogleAuthenticator.getQrCodeText(dto.getSecret(),email , domain),200,200)); + } + return Result.success(dto); + } + + @Override + @Transactional + public Result sendOpenGoogleCode() { + String email = UserThreadLocal.getUserEmail(); + if(StringUtils.isNull(email)){ + return Result.fail("token解析异常"); + } + boolean success = true; + + //判断用户是不是恶意刷邮箱,在规定时间内进行的 + String redisKey = RedisAuthKey.getGoogleOpenCodeKey( email); + if (redisService.hasKey(redisKey)) { + Object o = redisService.getCacheObject(redisKey); + + EmailCodeValue emailCodeValue = JSON.parseObject(JSON.toJSONString(o), EmailCodeValue.class); + if (emailCodeValue.getTimes() > 4) { + return Result.fail("请求次数过多,请10分钟后再试,(同一用户10分钟内只能请求4次)"); + } else { + + String emailCode = CodeUtils.creatCode(6); + emailCodeValue.setEmailCode(emailCode); + emailCodeValue.setTimes(emailCodeValue.getTimes() + 1); + long overTime = redisService.getExpire(redisKey); + redisService.setCacheObject(redisKey, emailCodeValue, overTime, TimeUnit.SECONDS + ); + success = sendEmail(email,emailCode); + } + } else { + String emailCode = CodeUtils.creatCode(6); + // 最多允许用户在10分钟内发送2次的邮箱验证 + // 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次 + EmailCodeValue emailCodeValue = new EmailCodeValue(); + emailCodeValue.setEmail(email); + emailCodeValue.setEmailCode(emailCode); + emailCodeValue.setTimes(1); + //设置失效时间10分钟 + redisService.setCacheObject(redisKey, emailCodeValue, + 10L, TimeUnit.MINUTES + ); + success = sendEmail(email,emailCode); + } + + return success ? Result.success("发送邮箱验证码成功") : Result.fail("发送邮箱验证码失败,请稍后重试"); + } + + public boolean sendEmail(String email,String code){ + String text = "您正在绑定谷歌验证器!\n" + + "您的邮箱验证验证码是:\n\t"+code + + "\n此验证码10分钟有效。"; + try { + //true 代表支持复杂的类型 + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(),true); + //邮件发信人 + mimeMessageHelper.setFrom(sendMailer); + //邮件收信人 1或多个 + mimeMessageHelper.setTo(email); + //邮件主题 + mimeMessageHelper.setSubject("[M2Pool] 邮箱验证码"); + //邮件内容 + mimeMessageHelper.setText(text); + //邮件发送时间 + mimeMessageHelper.setSentDate(new Date()); + + //发送邮件 + javaMailSender.send(mimeMessageHelper.getMimeMessage()); + //System.out.println("发送邮件成功:"+sendMailer+"->"+to); + return true; + } catch (Exception e) { + System.out.println("发送邮件失败:"+e.getMessage()); + return false; + } + } + + + @Override + public Result sendCloseGoogleCode() { + String email = SecurityUtils.getUsername(); + if(StringUtils.isNull(email)){ + return Result.fail("token解析异常"); + } + + boolean success; + //判断用户是不是恶意刷邮箱,在规定时间内进行的 + String redisKey = RedisAuthKey.getGoogleCloseCodeKey( email); + if (redisService.hasKey(redisKey)) { + Object o = redisService.getCacheObject(redisKey); + + EmailCodeValue emailCodeValue = JSON.parseObject(JSON.toJSONString(o), EmailCodeValue.class); + if (emailCodeValue.getTimes() > 4) { + return Result.fail("请求次数过多,请10分钟后再试,(同一用户10分钟内只能请求4次)"); + } else { + + String emailCode = CodeUtils.creatCode(6); + emailCodeValue.setEmailCode(emailCode); + + emailCodeValue.setTimes(emailCodeValue.getTimes() + 1); + long overTime = redisService.getExpire(redisKey); + redisService.setCacheObject(redisKey, emailCodeValue, overTime, TimeUnit.SECONDS + ); + success = sendEmail(email,emailCode); + } + } else { + String emailCode = CodeUtils.creatCode(6); + // 最多允许用户在10分钟内发送2次的邮箱验证 + // 0s倒计时后用户可以再发送验证码,但是间隔在10分钟内只能再发送1次 + EmailCodeEntity emailCodeEntity = new EmailCodeEntity(); + emailCodeEntity.setEmail(email); + emailCodeEntity.setEmailCode(emailCode); + emailCodeEntity.setTimes(1); + //设置失效时间10分钟 + redisService.setCacheObject(redisKey, emailCodeEntity, + 10L, TimeUnit.MINUTES + ); + success = sendCloseEmail(email,emailCode); + } + return success ? Result.success("发送邮箱验证码成功") : Result.fail("发送邮箱验证码失败,请稍后重试"); + } + public boolean sendCloseEmail(String email,String code){ + String text = "M2Pool:\n" + + "您正在解绑谷歌验证器!\n" + + "您的邮箱验证验证码是:\n\t"+code + + "\n此验证码10分钟有效。"; + try { + //true 代表支持复杂的类型 + MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(javaMailSender.createMimeMessage(),true); + //邮件发信人 + mimeMessageHelper.setFrom(sendMailer); + //邮件收信人 1或多个 + mimeMessageHelper.setTo(email); + //邮件主题 + mimeMessageHelper.setSubject("[M2Pool] 邮箱验证码"); + //邮件内容 + mimeMessageHelper.setText(text); + //邮件发送时间 + mimeMessageHelper.setSentDate(new Date()); + + //发送邮件 + javaMailSender.send(mimeMessageHelper.getMimeMessage()); + //System.out.println("发送邮件成功:"+sendMailer+"->"+to); + return true; + } catch (Exception e) { + System.out.println("发送邮件失败:"+e.getMessage()); + return false; + } + } + + @Override + public Result closeStepTwo(GoogleCloseVo vo) { + // 参数校验 + if (StringUtils.isNull(vo)){ + return Result.fail("未获取到请求参数"); + } + String email = SecurityUtils.getUsername(); + if(StringUtils.isNull(email)){ + return Result.fail("token解析异常"); + } + + // 根据邮箱查询是否已绑定 + UserGoogleAuthInfo info = leaseUserMapper.getUserInfoByEmail(email); + + if(StringUtils.isBlank(info.getSecret())){ + return Result.success(); + }else { + + //已绑定 正常走关闭谷歌验证流程 + //校验gcode + boolean gResult = GoogleAuthenticator.checkCode(info.getSecret(), vo.getGCode(), System.currentTimeMillis()); + if(!gResult){ + return Result.fail("谷歌验证码错误"); + } + //校验邮箱验证码 + String redisKey = RedisAuthKey.getGoogleCloseCodeKey( email); + if(redisService.hasKey(redisKey)){ + + Object o = redisService.getCacheObject(redisKey);//google:email:close + + EmailCodeValue emailCodeValue = JSON.parseObject(JSON.toJSONString(o), EmailCodeValue.class); + + //验证验证码 + if(!vo.getECode().equals(emailCodeValue.getEmailCode())){ + return Result.fail("邮箱验证码错误"); + } + }else { + return Result.fail("邮箱验证码 未获取或已过期(有效期10分钟),请重新获取验证码"); + } + + //入库 + boolean bingResult = leaseUserMapper.closeGoogleAuthenticator(info); + if(bingResult){ + return Result.success(); + }else { + return Result.fail("请求服务器失败,请重试"); + } + } + } @Override @Transactional diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleBindVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleBindVo.java new file mode 100644 index 0000000..498f658 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleBindVo.java @@ -0,0 +1,37 @@ +package com.m2pool.lease.vo.v2; + +import com.m2pool.lease.annotation.EncryptedField; +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class GoogleBindVo { + + /** + * 谷歌验证器 安全码 + */ + @NotBlank + public String secret; + + /** + * 谷歌验证器验证码 + */ + public long gCode; + + /** + * 邮箱验证码 + */ + @NotBlank + public String eCode; + + /** + * 当前用户密码 + */ + @EncryptedField + @NotBlank + public String pwd; + + + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleCloseVo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleCloseVo.java new file mode 100644 index 0000000..76f8c85 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/GoogleCloseVo.java @@ -0,0 +1,22 @@ +package com.m2pool.lease.vo.v2; + +import lombok.Data; + +import javax.validation.constraints.NotBlank; + +@Data +public class GoogleCloseVo { + + + /** + * 谷歌验证器验证码 + */ + public long gCode; + + /** + * 邮箱验证码 + */ + @NotBlank + public String eCode; + +} diff --git a/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/UserGoogleAuthInfo.java b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/UserGoogleAuthInfo.java new file mode 100644 index 0000000..70e58f7 --- /dev/null +++ b/m2pool-modules/m2pool-lease/src/main/java/com/m2pool/lease/vo/v2/UserGoogleAuthInfo.java @@ -0,0 +1,23 @@ +package com.m2pool.lease.vo.v2; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class UserGoogleAuthInfo implements Serializable { + + /** 邮箱 */ + private String email; + + /** 谷歌验证码 */ + private String secret; + + private String pwd; + + /** 谷歌验证码 */ + private int status; + + + +} diff --git a/m2pool-modules/m2pool-lease/src/main/resources/bootstrap-test.yml b/m2pool-modules/m2pool-lease/src/main/resources/bootstrap-test.yml index 7b91062..e78f9d5 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/bootstrap-test.yml +++ b/m2pool-modules/m2pool-lease/src/main/resources/bootstrap-test.yml @@ -96,3 +96,9 @@ netty: port: 2345 image: prefix: https://test.m2pool.com + +myenv: + domain: https://www.m2pool.com + path: /var/www/html/web + img: /img + filepath: /home/ubuntu/prod diff --git a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserMapper.xml b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserMapper.xml index 05847ad..b04204f 100644 --- a/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserMapper.xml +++ b/m2pool-modules/m2pool-lease/src/main/resources/mapper/lease/LeaseUserMapper.xml @@ -16,16 +16,47 @@ id, user_id, password, create_time, update_time + + + + + update lease_user + set + google_auth = #{info.secret}, + google_status = #{info.status}, + update_time = sysdate() + where user_id = #{info.email} + + + update lease_user + set + google_auth = '', + google_status = 0 + where user_id = #{info.email} +