From be9faa244526c172af5a477994b3471ce6b53fff Mon Sep 17 00:00:00 2001 From: "Ray.Hao" <1490493387@qq.com> Date: Fri, 30 May 2025 00:01:07 +0800 Subject: [PATCH] =?UTF-8?q?wip:=20=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=87=8D=E6=9E=84=E4=B8=B4=E6=97=B6=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/controller/AuthController.java | 35 ++++++++++---- .../boot/shared/auth/service/AuthService.java | 24 ++++++---- .../auth/service/impl/AuthServiceImpl.java | 46 +++++++++---------- 3 files changed, 65 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java b/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java index ca1c9f44..109dc172 100644 --- a/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java +++ b/src/main/java/com/youlai/boot/shared/auth/controller/AuthController.java @@ -63,18 +63,37 @@ public class AuthController { return Result.success(authenticationToken); } - @Operation(summary = "微信小程序授权登录") - @PostMapping("/login/wechat-mini-program") - @Log(value = "微信登录", module = LogModuleEnum.LOGIN) - public Result loginByWechatMiniProgram( - @Parameter(description = "微信授权码", example = "code") @RequestParam String code + @Operation( + summary = "微信小程序授权码登录", + description = "通过微信临时授权码(code)快速登录,自动注册未绑定用户" + ) + @PostMapping("/wx/miniapp/code-login") + @Log(value = "微信授权码登录", module = LogModuleEnum.LOGIN) + public Result loginByWechatMiniCode( + @Parameter(description = "微信临时登录凭证", example = "071XHa000ABCdefGHI1234567890XHa3") @RequestParam String code ) { - AuthenticationToken loginResult = authService.loginByWechatMiniProgram(code); + AuthenticationToken loginResult = authService.loginByWechatMiniCode(code); return Result.success(loginResult); } + @Operation( + summary = "微信小程序手机号一键登录", + description = "通过加密数据(encryptedData+iv)获取用户手机号并登录" + ) + @PostMapping("/wx/miniapp/phone-login") + @Log(value = "微信手机号一键登录", module = LogModuleEnum.LOGIN) + public Result loginByWechatMiniPhone( + @Parameter(description = "微信临时登录凭证", example = "071XHa000ABCdefGHI1234567890XHa3") @RequestParam String code, + @Parameter(description = "加密的手机号数据", example = "CiyLU1Aw2KjvrjMdj8YKli...") @RequestParam String encryptedData, + @Parameter(description = "解密算法初始向量", example = "r7BXXKkLb8qrSNn05n0qiA==") @RequestParam String iv + ) { + AuthenticationToken loginResult = authService.loginByWechatMiniPhone(code, encryptedData, iv); + return Result.success(loginResult); + } + + @Operation(summary = "发送登录短信验证码") - @PostMapping("/login/sms/code") + @PostMapping("/sms/code") public Result sendLoginVerifyCode( @Parameter(description = "手机号", example = "18812345678") @RequestParam String mobile ) { @@ -83,7 +102,7 @@ public class AuthController { } @Operation(summary = "短信验证码登录") - @PostMapping("/login/sms") + @PostMapping("/sms") @Log(value = "短信验证码登录", module = LogModuleEnum.LOGIN) public Result loginBySms( @Parameter(description = "手机号", example = "18812345678") @RequestParam String mobile, diff --git a/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java b/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java index 0d97e9d6..ac1f68c3 100644 --- a/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java +++ b/src/main/java/com/youlai/boot/shared/auth/service/AuthService.java @@ -40,14 +40,6 @@ public interface AuthService { */ AuthenticationToken refreshToken(String refreshToken); - /** - * 微信小程序登录 - * - * @param code 微信登录code - * @return 登录结果 - */ - AuthenticationToken loginByWechatMiniProgram(String code); - /** * 发送短信验证码 * @@ -63,4 +55,20 @@ public interface AuthService { * @return 登录结果 */ AuthenticationToken loginBySms(String mobile, String code); + + /** + * 微信小程序登录 + * + * @param code 微信登录code + * @return 登录结果 + */ + AuthenticationToken loginByWechatMiniCode(String code); + + /** + * 微信小程序登录 + * + * @param code 微信登录code + * @return 登录结果 + */ + AuthenticationToken loginByWechatMiniPhone( String code,String encryptedData, String iv); } diff --git a/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java b/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java index 59fdb59b..db75f6d6 100644 --- a/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java +++ b/src/main/java/com/youlai/boot/shared/auth/service/impl/AuthServiceImpl.java @@ -78,26 +78,6 @@ public class AuthServiceImpl implements AuthService { return authenticationTokenResponse; } - /** - * 微信一键授权登录 - * - * @param code 微信登录code - * @return 访问令牌 - */ - @Override - public AuthenticationToken loginByWechatMiniProgram(String code) { - // 1. 创建用户微信认证的令牌(未认证) - WechatAuthenticationToken wechatAuthenticationToken = new WechatAuthenticationToken(code); - - // 2. 执行认证(认证中) - Authentication authentication = authenticationManager.authenticate(wechatAuthenticationToken); - - // 3. 认证成功后生成 JWT 令牌,并存入 Security 上下文,供登录日志 AOP 使用(已认证) - AuthenticationToken authenticationToken = tokenManager.generateToken(authentication); - SecurityContextHolder.getContext().setAuthentication(authentication); - - return authenticationToken; - } /** * 发送登录短信验证码 @@ -108,10 +88,8 @@ public class AuthServiceImpl implements AuthService { public void sendSmsLoginCode(String mobile) { // 随机生成4位验证码 - // String code = String.valueOf((int) ((Math.random() * 9 + 1) * 1000)); - // TODO 为了方便测试,验证码固定为 1234,实际开发中在配置了厂商短信服务后,可以使用上面的随机验证码 - String code = "1234"; - + String code = String.valueOf((int) ((Math.random() * 9 + 1) * 1000)); + log.info("【调试模式】手机号 {} 的验证码为:{}", mobile, code); // 发送短信验证码 Map templateParams = new HashMap<>(); templateParams.put("code", code); @@ -146,6 +124,26 @@ public class AuthServiceImpl implements AuthService { return authenticationToken; } + @Override + public AuthenticationToken loginByWechatMiniCode(String code) { + // 1. 创建用户微信认证的令牌(未认证) + WechatAuthenticationToken wechatAuthenticationToken = new WechatAuthenticationToken(code); + + // 2. 执行认证(认证中) + Authentication authentication = authenticationManager.authenticate(wechatAuthenticationToken); + + // 3. 认证成功后生成 JWT 令牌,并存入 Security 上下文,供登录日志 AOP 使用(已认证) + AuthenticationToken authenticationToken = tokenManager.generateToken(authentication); + SecurityContextHolder.getContext().setAuthentication(authentication); + + return authenticationToken; + } + + @Override + public AuthenticationToken loginByWechatMiniPhone(String code, String encryptedData, String iv) { + return null; + } + /** * 注销登录 */