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}
+