From 8c20b51e13bf980c61a20e0cb46e09f67ca17a19 Mon Sep 17 00:00:00 2001 From: shahaibo <1023316923@qq.com> Date: Mon, 11 Nov 2024 16:04:26 +0800 Subject: [PATCH] =?UTF-8?q?TASK:=E8=B0=B7=E6=AD=8C=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/filter/AuthenticationFilter.java | 2 +- .../da/controller/ThirdPartyController.java | 7 ++ .../mapper/primary/entity/AccountExtend.java | 30 +++++++ .../primary/entity/AccountExtendMapper.java | 17 ++++ .../da/mapper/primary/entity/GoogleUser.java | 10 +++ .../ai/da/model/vo/GoogleTokenResponse.java | 10 +++ .../com/ai/da/service/AccountService.java | 3 + .../da/service/impl/AccountServiceImpl.java | 83 +++++++++++++++++++ 8 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java create mode 100644 src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java create mode 100644 src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java diff --git a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java index 894a2231..a70bc51b 100644 --- a/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java +++ b/src/main/java/com/ai/da/common/security/filter/AuthenticationFilter.java @@ -51,7 +51,7 @@ public class AuthenticationFilter extends OncePerRequestFilter { "/api/python/flush","/api/account/healthy","/api/ali-pay/trade/notify","/api/paypal/ipn/back","/api/alipay-hk/trade/notify", "/api/portfolio/page", "/api/portfolio/detail", "/api/portfolio/commentPage", "/api/portfolio/viewsIncrease", "/api/account/designWorksRegister","/api/account/questionnaire","/api/stripe/trade/notify", - "/notification","/api/account/activateNewEmail" + "/notification","/api/account/activateNewEmail","/api/third/party/auth/google_callback" ); @Override diff --git a/src/main/java/com/ai/da/controller/ThirdPartyController.java b/src/main/java/com/ai/da/controller/ThirdPartyController.java index 0e7f95fd..e077fa8c 100644 --- a/src/main/java/com/ai/da/controller/ThirdPartyController.java +++ b/src/main/java/com/ai/da/controller/ThirdPartyController.java @@ -14,6 +14,7 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.validation.Valid; import java.security.cert.X509Certificate; @@ -114,4 +115,10 @@ public class ThirdPartyController { public Response updateNoLoginRequiredNew(@RequestBody NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request) { return Response.success(accountService.updateNoLoginRequiredNew(noLoginRequiredDTO, request)); } + + @CrossOrigin + @GetMapping("/auth/google_callback") + public Response googleCallback(@RequestParam("code") String code, HttpSession session) { + return Response.success(accountService.googleCallback(code, session)); + } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java new file mode 100644 index 00000000..5742f0ec --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtend.java @@ -0,0 +1,30 @@ +package com.ai.da.mapper.primary.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("account_extend") +public class AccountExtend implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + private Long accountId; + + private String authType; + + private String auth; +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java new file mode 100644 index 00000000..312fa810 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/AccountExtendMapper.java @@ -0,0 +1,17 @@ +package com.ai.da.mapper.primary.entity; + +import com.ai.da.common.config.mybatis.plus.CommonMapper; + +import java.util.Date; +import java.util.List; + +/** + * Mapper 接口 + * + * @author easy-generator + * @since 2022-06-13 + */ +public interface AccountExtendMapper extends CommonMapper { + + +} diff --git a/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java b/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java new file mode 100644 index 00000000..b15410e8 --- /dev/null +++ b/src/main/java/com/ai/da/mapper/primary/entity/GoogleUser.java @@ -0,0 +1,10 @@ +package com.ai.da.mapper.primary.entity; + +import lombok.Data; + +@Data +public class GoogleUser { + private String id; + private String email; + private String name; +} diff --git a/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java b/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java new file mode 100644 index 00000000..f742d3c0 --- /dev/null +++ b/src/main/java/com/ai/da/model/vo/GoogleTokenResponse.java @@ -0,0 +1,10 @@ +package com.ai.da.model.vo; + +import lombok.Data; + +@Data +public class GoogleTokenResponse { + private String accessToken; + private String idToken; + +} diff --git a/src/main/java/com/ai/da/service/AccountService.java b/src/main/java/com/ai/da/service/AccountService.java index 5db57bc8..6e5c5b5f 100644 --- a/src/main/java/com/ai/da/service/AccountService.java +++ b/src/main/java/com/ai/da/service/AccountService.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import java.util.List; import java.util.Map; @@ -181,4 +182,6 @@ public interface AccountService extends IService { String updateNoLoginRequiredNew(NoLoginRequiredDTO noLoginRequiredDTO, HttpServletRequest request); void halfPricePromotion(); + + String googleCallback(String code, HttpSession session); } diff --git a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java index 0cf6e66e..81bfd846 100644 --- a/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AccountServiceImpl.java @@ -34,10 +34,12 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.Assert; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; import javax.sql.DataSource; import java.math.BigDecimal; import java.sql.Connection; @@ -62,6 +64,9 @@ public class AccountServiceImpl extends ServiceImpl impl @Resource private AccountMapper accountMapper; + @Resource + private AccountExtendMapper accountExtendMapper; + @Resource private JWTTokenHelper jwtTokenHelper; @@ -1822,4 +1827,82 @@ public class AccountServiceImpl extends ServiceImpl impl log.info("邮箱绑定更改完成,用户id:{},新邮箱:{}", accountId, newMailbox); } + @Override + public String googleCallback(String code, HttpSession session) { + try { + log.info("code:" + code); + // 使用 code 获取 Google 用户信息 + GoogleUser googleUser = getGoogleUserFromCode(code); + log.info("googleUser:" + JSON.toJSONString(googleUser)); + + // 检查数据库中是否已有该用户 +// QueryWrapper qw = new QueryWrapper<>(); +// qw.lambda().eq(AccountExtend::getAuth, googleUser.getId()); +// List accountExtends = accountExtendMapper.selectList(qw); +// Account existingUser = findUserByGoogleId(googleUser.getId()); + return "Login successful"; +// if (CollectionUtil.isNotEmpty(accountExtends)) { +// // 用户已存在,直接登录 +//// session.setAttribute("user", existingUser); +// return "Login successful"; +// } else { +// // 用户不存在,创建新用户(自动注册) +//// User newUser = googleAuthService.registerNewUser(googleUser); +//// session.setAttribute("user", newUser); +// return "Registration and login successful"; +// } + } catch (Exception e) { + return "Error processing Google login: " + e.getMessage(); + } + } + + private static final String TOKEN_URL = "https://oauth2.googleapis.com/token"; + private static final String USER_INFO_URL = "https://www.googleapis.com/oauth2/v3/userinfo"; + private static final String CLIENT_ID = "194770296147-njd68pm7tnapgonkj2h48mhf63n15n3f.apps.googleusercontent.com"; + private static final String CLIENT_SECRET = "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"; + private static final String REDIRECT_URI = "https://www.api.aida.com.hk/api/third/party/auth/google_callback"; + + public GoogleUser getGoogleUserFromCode(String code) { + // Step 1: Exchange code for access_token + String accessToken = getAccessToken(code); + log.info("accessToken" + accessToken); + + // Step 2: Use access_token to get Google User info + return getGoogleUserInfo(accessToken); + } + + private String getAccessToken(String code) { + RestTemplate restTemplate = new RestTemplate(); + Map params = new HashMap<>(); + params.put("client_id", CLIENT_ID); + params.put("client_secret", CLIENT_SECRET); + params.put("redirect_uri", REDIRECT_URI); + params.put("grant_type", "authorization_code"); + params.put("code", code); + + // 使用 RestTemplate 发起请求以获取 access_token + GoogleTokenResponse response = restTemplate.postForObject(TOKEN_URL, params, GoogleTokenResponse.class); + return response.getAccessToken(); + } + + private GoogleUser getGoogleUserInfo(String accessToken) { + RestTemplate restTemplate = new RestTemplate(); + String url = USER_INFO_URL + "?access_token=" + accessToken; + return restTemplate.getForObject(url, GoogleUser.class); + } + +// public User findUserByGoogleId(String googleId) { +// // 从数据库中根据 Google ID 查找用户 +// return userRepository.findByGoogleId(googleId); +// } + +// public User registerNewUser(GoogleUser googleUser) { +// // 创建并保存新用户 +// User newUser = new User(); +// newUser.setGoogleId(googleUser.getId()); +// newUser.setEmail(googleUser.getEmail()); +// newUser.setUsername(googleUser.getName()); +// return userRepository.save(newUser); +// } + }