From d0d6e4b5bef92a46e1618259cea71d0734947031 Mon Sep 17 00:00:00 2001 From: khalil Date: Wed, 9 Jul 2025 16:00:38 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E7=99=BB=E5=BD=95-g?= =?UTF-8?q?oogle-=E6=B3=A8=E5=86=8C=E6=97=B6=E6=8F=90=E5=8F=96jws=E9=87=8C?= =?UTF-8?q?=E7=9A=84email=E8=B5=8B=E4=BA=88account?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/user/GoogleOpenidRefService.java | 3 +- .../user/impl/GoogleOpenidRefServiceImpl.java | 40 ++--- .../event/UserRegisterSuccessEvent.java | 16 -- .../listener/UserRegisterSuccessListener.java | 51 ------ .../listener/UserRegisterWarningListener.java | 166 ------------------ .../service/account/AccountManageService.java | 28 ++- 6 files changed, 31 insertions(+), 273 deletions(-) delete mode 100644 accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/event/UserRegisterSuccessEvent.java delete mode 100644 accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterSuccessListener.java delete mode 100644 accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterWarningListener.java diff --git a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/GoogleOpenidRefService.java b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/GoogleOpenidRefService.java index 33fd05bba..5d3c05319 100644 --- a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/GoogleOpenidRefService.java +++ b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/GoogleOpenidRefService.java @@ -11,7 +11,6 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface GoogleOpenidRefService extends IService { - String getUnionIdByEmail(String email, String idToken); + GoogleOpenidRef getRefByEmail(String email, String idToken); - void saveRecord(String email, String openId); } diff --git a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/impl/GoogleOpenidRefServiceImpl.java b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/impl/GoogleOpenidRefServiceImpl.java index db78f2f32..4828b6399 100644 --- a/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/impl/GoogleOpenidRefServiceImpl.java +++ b/accompany-base/accompany-basic/accompany-basic-service/src/main/java/com/accompany/core/service/user/impl/GoogleOpenidRefServiceImpl.java @@ -10,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; -import java.util.Optional; /** * google关联表 服务实现类 @@ -21,34 +20,29 @@ import java.util.Optional; @Service public class GoogleOpenidRefServiceImpl extends ServiceImpl implements GoogleOpenidRefService { - @Autowired private GoogleTokenVerifier googleTokenVerifier; @Override - public String getUnionIdByEmail(String email, String idToken) { + public GoogleOpenidRef getRefByEmail(String email, String idToken) { GoogleOpenidRef googleOpenidRef = baseMapper.selectById(email); - return Optional.ofNullable(googleOpenidRef) - .map(x -> x.getOpenId()) - .orElseGet(() -> { - GoogleTokenVerifier.GoogleUserInfo sub = googleTokenVerifier.verifyAndGetUserInfo(idToken); - if (sub != null && StringUtils.isNotEmpty(sub.getUserId()) && email.equals(sub.getEmail())) { - String userId = sub.getUserId(); - saveRecord(email, userId); - return userId; - } - return null; - }); - } + if (null != googleOpenidRef){ + return googleOpenidRef; + } + if (StringUtils.isBlank(idToken)){ + return null; + } + GoogleTokenVerifier.GoogleUserInfo sub = googleTokenVerifier.verifyAndGetUserInfo(idToken); + if (sub != null && StringUtils.isNotEmpty(sub.getUserId()) && email.equals(sub.getEmail())) { + googleOpenidRef = new GoogleOpenidRef(); + googleOpenidRef.setEmail(sub.getEmail()); + googleOpenidRef.setOpenId(sub.getUserId()); + googleOpenidRef.setCreateTime(new Date()); + baseMapper.insert(googleOpenidRef); - @Override - public void saveRecord(String email, String openId) { - GoogleOpenidRef googleOpenidRef = new GoogleOpenidRef(); - googleOpenidRef.setEmail(email); - googleOpenidRef.setOpenId(openId); - googleOpenidRef.setCreateTime(new Date()); - baseMapper.insert(googleOpenidRef); + return googleOpenidRef; + } + return null; } - } diff --git a/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/event/UserRegisterSuccessEvent.java b/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/event/UserRegisterSuccessEvent.java deleted file mode 100644 index 2afbb38df..000000000 --- a/accompany-oauth2/accompany-oauth2-sdk/src/main/java/com/accompany/oauth2/event/UserRegisterSuccessEvent.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.accompany.oauth2.event; - -import org.springframework.context.ApplicationEvent; - -/** - *@description 用户注册事件 - *@author yangziwen - *@datetime 2019-04-22 15:44 - *@since v1.0 - */ -public class UserRegisterSuccessEvent extends ApplicationEvent { - - public UserRegisterSuccessEvent(Object source) { - super(source); - } -} diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterSuccessListener.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterSuccessListener.java deleted file mode 100644 index a0c2c23f7..000000000 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterSuccessListener.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.accompany.oauth2.event.listener; - -import com.accompany.common.config.WebSecurityConfig; -import com.accompany.common.utils.HttpUtils; -import com.accompany.core.model.Account; -import com.accompany.oauth2.event.UserRegisterSuccessEvent; -import com.google.gson.Gson; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationListener; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -/** - * 用户注册监听器 - */ -//@Component -public class UserRegisterSuccessListener implements ApplicationListener { - - private static final Logger logger = LoggerFactory.getLogger(UserRegisterSuccessListener.class); - - private Gson gson = new Gson(); - - @Autowired - WebSecurityConfig webSecurityConfig; - - @Override - @Async - public void onApplicationEvent(UserRegisterSuccessEvent userRegisterEvent) { - logger.info("UserRegisterSuccessListener start =============="); - Account account = (Account) userRegisterEvent.getSource(); - logger.info("UserRegisterSuccessListener account:{} ==============", account.getUid()); - - // http通知到business - Map params = new HashMap<>(); - params.put("data", gson.toJson(account)); - params.put("key", webSecurityConfig.getUserRegisterSuccessNotifyKey()); - logger.info("UserRegisterSuccessListener params:{}", params); - try { - HttpUtils.doPost(webSecurityConfig.getUserRegisterSuccessNotifyUrl(), params); - } catch (Exception e) { - logger.error("UserRegisterSuccessListener error:{}", e); - } - - logger.info("UserRegisterSuccessListener end =============="); - } -} \ No newline at end of file diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterWarningListener.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterWarningListener.java deleted file mode 100644 index 28151d5b1..000000000 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/event/listener/UserRegisterWarningListener.java +++ /dev/null @@ -1,166 +0,0 @@ -package com.accompany.oauth2.event.listener; - -import com.accompany.common.redis.RedisKey; -import com.accompany.common.utils.DateTimeUtil; -import com.accompany.core.service.common.JedisService; -import com.accompany.oauth2.event.UserRegisterSuccessEvent; -import com.alibaba.fastjson.JSONObject; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationListener; -import org.springframework.util.StringUtils; - -import java.util.Calendar; -import java.util.Date; -import java.util.List; - -/** - * 用户注册预警监听器 - *@author yangziwen - *@datetime 2019-04-22 15:54 - *@since v1.0 - */ -//@Component -public class UserRegisterWarningListener implements ApplicationListener { - - private static final Logger logger = LoggerFactory.getLogger(UserRegisterWarningListener.class); - - /** 用户注册数默认一级预警比率 */ - private static final Double DEFAULT_LEVEL1_RATE = 1.5; - /** 用户注册数默认二级预警比率 */ - private static final Double DEFAULT_LEVEL2_RATE = 2.0; - /** 用户注册数默认平均值 */ - private static final Double DEFAULT_AVERAGE_NUMBER = 3000.0; - - @Autowired - private JedisService jedisService; - - @Override - public void onApplicationEvent(UserRegisterSuccessEvent userRegisterEvent) { - // 今天当前注册用户数 - String todayStr = DateTimeUtil.getTodayStr(); - Long todayRegisterUserNumbers = this.jedisService.hincr(RedisKey.daily_register_user_number.getKey(), todayStr); - Double averageRegisterNumber = this.getAverageRegisterNumber(todayStr); - - // 检查是否触发一级预警,如果已经发送过不需要重复预警 - String level1WarningRateStr = this.jedisService.get(RedisKey.daily_register_level1_warning_rate.getKey()); - Double level1WarningRate = level1WarningRateStr == null ? DEFAULT_LEVEL1_RATE : Double.parseDouble(level1WarningRateStr); - if (todayRegisterUserNumbers > averageRegisterNumber * level1WarningRate && !hasSentLevel1Warning()) { - String warningMessage = "用户注册一级预警,当前注册人数为" + todayRegisterUserNumbers; - this.sendWarningMessage(warningMessage, RedisKey.daily_register_level1_warning_flag.getKey()); - - return; - } - - // 检查是否触发二级预警,如果已经发送过不需要重复预警 - String level2WarningRateStr = this.jedisService.get(RedisKey.daily_register_level1_warning_rate.getKey()); - Double level2WarningRate = level2WarningRateStr == null ? DEFAULT_LEVEL2_RATE : Double.parseDouble(level2WarningRateStr); - if (todayRegisterUserNumbers > averageRegisterNumber * level2WarningRate && !hasSentLevel2Warning()) { - String warningMessage = "用户注册二级预警,当前注册人数为" + todayRegisterUserNumbers; - this.sendWarningMessage(warningMessage, RedisKey.daily_register_level2_warning_flag.getKey()); - - return; - } - } - - /** - * 是否已发送过二级预警 - * @return true/false - */ - private boolean hasSentLevel2Warning() { - String level1WarningStr = this.jedisService.get(RedisKey.daily_register_level2_warning_flag.getKey()); - return level1WarningStr == null ? Boolean.FALSE : Boolean.parseBoolean(level1WarningStr); - } - - /** - * 是否已发送过一级预警 - * @return true/false - */ - private boolean hasSentLevel1Warning() { - String level1WarningStr = this.jedisService.get(RedisKey.daily_register_level1_warning_flag.getKey()); - return level1WarningStr == null ? Boolean.FALSE : Boolean.parseBoolean(level1WarningStr); - } - - /** - * 发送预警短信信息 - * @param message - */ - private void sendWarningMessage(String message, String warningLevel) { - // TODO: 手机号应该设置到配置表(sys_config)方便后台配置,等项目重构完成后修正 - String phone = this.jedisService.get(RedisKey.daily_register_warning_phone.getKey()); - if (StringUtils.isEmpty(phone)) { - logger.error("USER REGISTER WARNING, MESSAGE={}, WARNING PHONE NOT AVAILABLE", message); - return; - } - - String phones = JSONObject.toJSONString(phone.split(",")); - try { - //this.netEaseService.sendTemplate(phones, propertyConfig.getTutuAlertSmsTemplateId(), JSONObject.toJSONString(Arrays.asList(message))); - this.updateWarningFlag(warningLevel); - } catch (Exception e) { - logger.error("FAILED TO SEND USER REGISTER WARNING MESSAGE[{}]", message, e); - } - } - - /** - * 更新报警标记 - * @param warningLevel - */ - private void updateWarningFlag(String warningLevel) { - Date currentTime = Calendar.getInstance().getTime(); - Date tomorrow = DateTimeUtil.addDays(currentTime, 1); - Date beginTimeOfTomorrow = DateTimeUtil.getBeginTimeOfDay(tomorrow); - Long expireSeconds = (beginTimeOfTomorrow.getTime() - currentTime.getTime()) / 1000; - - this.jedisService.set(warningLevel, Boolean.TRUE.toString(), expireSeconds.intValue()); - } - - /** - * 计算最近七天日平均注册用户数,去掉最高值 - * @param dateStr yyyy-MM-dd 格式的日期字符串 - * @return - */ - private Double getAverageRegisterNumber(String dateStr) { - String averageRegisterNumberStr = this.jedisService.hget(RedisKey.daily_register_average_number.getKey(), dateStr); - if (averageRegisterNumberStr != null) { - return Double.parseDouble(averageRegisterNumberStr); - } - - List registerNumbers = this.jedisService.hmread(RedisKey.daily_register_user_number.getKey(), this.getLatestSevenDaysStr()); - if (registerNumbers == null || registerNumbers.isEmpty()) { - return DEFAULT_AVERAGE_NUMBER; - } - - Double maxNumber = 0.0, totalNumber = 0.0; - for (String registerNumberStr : registerNumbers) { - if (StringUtils.isEmpty(registerNumberStr)){ - continue; - } - - Double registerNumber = Double.parseDouble(registerNumberStr); - totalNumber += registerNumber; - maxNumber = registerNumber > maxNumber ? registerNumber : maxNumber; - } - - Double averageRegisterNumber = (totalNumber - maxNumber) / 6; - this.jedisService.hset(RedisKey.daily_register_average_number.getKey(), dateStr, String.valueOf(averageRegisterNumber)); - - return averageRegisterNumber; - } - - /** - * 获取最近七天日期 yyyy-MM-dd 格式的字符串数组 - * @return - */ - private String[] getLatestSevenDaysStr() { - Date today = Calendar.getInstance().getTime(); - String[] days = new String[7]; - for (int i = 0, size = days.length; i < size; i++) { - days[i] = DateTimeUtil.convertDate(DateTimeUtil.addDays(today, -(i + 1)), DateTimeUtil.DEFAULT_DATE_PATTERN); - } - - return days; - } - -} diff --git a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java index cccd0c6c7..8be5469ad 100644 --- a/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java +++ b/accompany-oauth2/accompany-oauth2-service/src/main/java/com/accompany/oauth2/service/account/AccountManageService.java @@ -12,6 +12,7 @@ import com.accompany.common.utils.DateTimeUtil; import com.accompany.common.utils.UUIDUtil; import com.accompany.core.exception.ServiceException; import com.accompany.core.model.Account; +import com.accompany.core.model.GoogleOpenidRef; import com.accompany.core.model.UserCancelRecord; import com.accompany.core.model.Users; import com.accompany.core.mybatismapper.AccountMapper; @@ -29,7 +30,6 @@ import com.accompany.email.service.EmailService; import com.accompany.oauth2.constant.LoginTypeEnum; import com.accompany.oauth2.dto.DayIpMaxRegisterLimitConfig; import com.accompany.oauth2.dto.RepeatedDeviceIpRegisterLimitConfig; -import com.accompany.oauth2.event.UserRegisterSuccessEvent; import com.accompany.oauth2.exception.CustomOAuth2Exception; import com.accompany.sms.service.SmsService; import com.alibaba.fastjson.JSON; @@ -37,7 +37,6 @@ import com.google.gson.Gson; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -64,8 +63,6 @@ public class AccountManageService { @Autowired private AccountService accountService; @Autowired - private ApplicationContext applicationContext; - @Autowired private UsersBaseService usersBaseService; @Autowired private UserCancelRecordService userCancelRecordService; @@ -145,14 +142,17 @@ public class AccountManageService { throw new ServiceException(BusiStatus.REQUEST_FAST); } - boolean googleLogin = LoginTypeEnum.GOOGLE.getValue() == type; - if (googleLogin) { - String sub = googleOpenidRefService.getUnionIdByEmail(openid, idToken); - if (sub != null) { - openid = sub; - unionId = sub; + String thirdAccountEmail = null; + + if (LoginTypeEnum.GOOGLE.getValue() == type) { + GoogleOpenidRef ref = googleOpenidRefService.getRefByEmail(openid, idToken); + if (null != ref) { + openid = ref.getOpenId(); + unionId = ref.getOpenId(); + thirdAccountEmail = ref.getEmail(); } } + Account account = accountService.getAccountByThird(type, unionId, null); if (account == null) { checkRegisterLimit(deviceInfo.getDeviceId(), ipAddress); @@ -172,6 +172,7 @@ public class AccountManageService { account.setThirdLoginType(type); account.setUnionId(unionId); account.setOpenId(openid); + account.setEmail(thirdAccountEmail); account = fillDeviceInfo(account, deviceInfo); @@ -186,8 +187,6 @@ public class AccountManageService { throw new Exception("第三方登录失败,openid=" + openid + ",异常原因code=" + tokenRet.getCode()); } - log.info("TRIGGER USER REGISTER SUCCESS EVENT"); - applicationContext.publishEvent(new UserRegisterSuccessEvent(account)); } else { // 已存在用户,先判断account中的unionId是否为空或者不一致,如果是的话则更新,不是则跳过 String state = account.getState(); @@ -284,7 +283,7 @@ public class AccountManageService { log.error("邮件email {} 注册异常,异常原因code {}", email, tokenRet.getCode()); throw new ServiceException(BusiStatus.SERVERBUSY); } - applicationContext.publishEvent(new UserRegisterSuccessEvent(account)); + return account; } @@ -332,8 +331,7 @@ public class AccountManageService { log.info("手机号码phone=" + phone + "注册异常,异常原因code=" + tokenRet.getCode()); throw new Exception("手机号码phone=" + phone + "注册异常,异常原因code=" + tokenRet.getCode()); } - log.info("TRIGGER USER REGISTER SUCCESS EVENT"); - applicationContext.publishEvent(new UserRegisterSuccessEvent(account)); + return account; }