Commit c402077961560bac0fbf9ac51b75bc86e2a384b4

Authored by YunaiV
1 parent 7227664f

进一步重构社交登陆的实现

Showing 18 changed files with 116 additions and 123 deletions
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/AppAuthController.java
@@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
23 23
24 @Api(tags = "用户 APP - 认证") 24 @Api(tags = "用户 APP - 认证")
25 @RestController 25 @RestController
26 -@RequestMapping("/member/") 26 +@RequestMapping("/member/auth")
27 @Validated 27 @Validated
28 @Slf4j 28 @Slf4j
29 public class AppAuthController { 29 public class AppAuthController {
@@ -33,7 +33,6 @@ public class AppAuthController { @@ -33,7 +33,6 @@ public class AppAuthController {
33 33
34 @PostMapping("/login") 34 @PostMapping("/login")
35 @ApiOperation("使用手机 + 密码登录") 35 @ApiOperation("使用手机 + 密码登录")
36 - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志  
37 public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) { 36 public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) {
38 String token = authService.login(reqVO, getClientIP(), getUserAgent()); 37 String token = authService.login(reqVO, getClientIP(), getUserAgent());
39 // 返回结果 38 // 返回结果
@@ -42,7 +41,6 @@ public class AppAuthController { @@ -42,7 +41,6 @@ public class AppAuthController {
42 41
43 @PostMapping("/sms-login") 42 @PostMapping("/sms-login")
44 @ApiOperation("使用手机 + 验证码登录") 43 @ApiOperation("使用手机 + 验证码登录")
45 - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志  
46 public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) { 44 public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) {
47 String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent()); 45 String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent());
48 // 返回结果 46 // 返回结果
@@ -51,7 +49,6 @@ public class AppAuthController { @@ -51,7 +49,6 @@ public class AppAuthController {
51 49
52 @PostMapping("/send-sms-code") 50 @PostMapping("/send-sms-code")
53 @ApiOperation(value = "发送手机验证码") 51 @ApiOperation(value = "发送手机验证码")
54 - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志  
55 public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) { 52 public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) {
56 authService.sendSmsCode(getLoginUserId(), reqVO); 53 authService.sendSmsCode(getLoginUserId(), reqVO);
57 return success(true); 54 return success(true);
@@ -60,7 +57,6 @@ public class AppAuthController { @@ -60,7 +57,6 @@ public class AppAuthController {
60 @PostMapping("/reset-password") 57 @PostMapping("/reset-password")
61 @ApiOperation(value = "重置密码", notes = "用户忘记密码时使用") 58 @ApiOperation(value = "重置密码", notes = "用户忘记密码时使用")
62 @PreAuthenticated 59 @PreAuthenticated
63 - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志  
64 public CommonResult<Boolean> resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) { 60 public CommonResult<Boolean> resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) {
65 authService.resetPassword(reqVO); 61 authService.resetPassword(reqVO);
66 return success(true); 62 return success(true);
@@ -87,35 +83,18 @@ public class AppAuthController { @@ -87,35 +83,18 @@ public class AppAuthController {
87 return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri)); 83 return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri));
88 } 84 }
89 85
90 - @PostMapping("/social-login")  
91 - @ApiOperation(value = "社交登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户")  
92 - public CommonResult<AppAuthLoginRespVO> socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) {  
93 - String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent()); 86 + @PostMapping("/social-quick-login")
  87 + @ApiOperation(value = "社交快捷登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户")
  88 + public CommonResult<AppAuthLoginRespVO> socialLogin(@RequestBody @Valid AppAuthSocialQuickLoginReqVO reqVO) {
  89 + String token = authService.socialQuickLogin(reqVO, getClientIP(), getUserAgent());
94 return success(AppAuthLoginRespVO.builder().token(token).build()); 90 return success(AppAuthLoginRespVO.builder().token(token).build());
95 } 91 }
96 92
97 - @PostMapping("/social-login2")  
98 - @ApiOperation(value = "社交登录,使用 手机号 + 手机验证码", notes = "适合未登录的用户,进行登录 + 绑定")  
99 - @OperateLog(enable = false) // 避免 Post 请求被记录操作日志  
100 - public CommonResult<AppAuthLoginRespVO> socialLogin2(@RequestBody @Valid AppAuthSocialLogin2ReqVO reqVO) {  
101 - String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent()); 93 + @PostMapping("/social-bind-login")
  94 + @ApiOperation(value = "社交绑定登录,使用 手机号 + 手机验证码", notes = "适合未登录的用户,进行登录 + 绑定")
  95 + public CommonResult<AppAuthLoginRespVO> socialLogin2(@RequestBody @Valid AppAuthSocialBindLoginReqVO reqVO) {
  96 + String token = authService.socialBindLogin(reqVO, getClientIP(), getUserAgent());
102 return success(AppAuthLoginRespVO.builder().token(token).build()); 97 return success(AppAuthLoginRespVO.builder().token(token).build());
103 } 98 }
104 99
105 - @PostMapping("/social-bind")  
106 - @ApiOperation(value = "社交绑定,使用 code 授权码", notes = "使用在用户已经登录的情况下")  
107 - @PreAuthenticated  
108 - public CommonResult<Boolean> socialBind(@RequestBody @Valid AppAuthSocialBindReqVO reqVO) {  
109 - authService.socialBind(getLoginUserId(), reqVO);  
110 - return CommonResult.success(true);  
111 - }  
112 -  
113 - @DeleteMapping("/social-unbind")  
114 - @ApiOperation("取消社交绑定")  
115 - @PreAuthenticated  
116 - public CommonResult<Boolean> socialUnbind(@RequestBody AppAuthSocialUnbindReqVO reqVO) {  
117 - authService.unbindSocialUser(getLoginUserId(), reqVO);  
118 - return CommonResult.success(true);  
119 - }  
120 -  
121 } 100 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLogin2ReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindLoginReqVO.java
@@ -14,12 +14,12 @@ import javax.validation.constraints.NotEmpty; @@ -14,12 +14,12 @@ import javax.validation.constraints.NotEmpty;
14 import javax.validation.constraints.NotNull; 14 import javax.validation.constraints.NotNull;
15 import javax.validation.constraints.Pattern; 15 import javax.validation.constraints.Pattern;
16 16
17 -@ApiModel("用户 APP - 社交登录 Request VO,使用 code 授权码 + 账号密码") 17 +@ApiModel("用户 APP - 社交绑定登录 Request VO,使用 code 授权码 + 账号密码")
18 @Data 18 @Data
19 @NoArgsConstructor 19 @NoArgsConstructor
20 @AllArgsConstructor 20 @AllArgsConstructor
21 @Builder 21 @Builder
22 -public class AppAuthSocialLogin2ReqVO { 22 +public class AppAuthSocialBindLoginReqVO {
23 23
24 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") 24 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
25 @InEnum(SocialTypeEnum.class) 25 @InEnum(SocialTypeEnum.class)
@@ -45,5 +45,4 @@ public class AppAuthSocialLogin2ReqVO { @@ -45,5 +45,4 @@ public class AppAuthSocialLogin2ReqVO {
45 @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字") 45 @Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
46 private String smsCode; 46 private String smsCode;
47 47
48 -  
49 } 48 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialBindReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialQuickLoginReqVO.java
@@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor;
12 import javax.validation.constraints.NotEmpty; 12 import javax.validation.constraints.NotEmpty;
13 import javax.validation.constraints.NotNull; 13 import javax.validation.constraints.NotNull;
14 14
15 -@ApiModel("用户 APP - 社交绑定 Request VO,使用 code 授权码") 15 +@ApiModel("用户 APP - 社交快捷登录 Request VO,使用 code 授权码")
16 @Data 16 @Data
17 @NoArgsConstructor 17 @NoArgsConstructor
18 @AllArgsConstructor 18 @AllArgsConstructor
19 @Builder 19 @Builder
20 -public class AppAuthSocialBindReqVO { 20 +public class AppAuthSocialQuickLoginReqVO {
21 21
22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") 22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
23 @InEnum(SocialTypeEnum.class) 23 @InEnum(SocialTypeEnum.class)
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/AppSocialUserController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.app.social;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
  7 +import cn.iocoder.yudao.module.member.convert.social.SocialUserConvert;
  8 +import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
  9 +import io.swagger.annotations.Api;
  10 +import io.swagger.annotations.ApiOperation;
  11 +import org.springframework.validation.annotation.Validated;
  12 +import org.springframework.web.bind.annotation.*;
  13 +
  14 +import javax.annotation.Resource;
  15 +import javax.validation.Valid;
  16 +
  17 +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  18 +
  19 +@Api(tags = "用户 App - 社交用户")
  20 +@RestController
  21 +@RequestMapping("/system/social-user")
  22 +@Validated
  23 +public class AppSocialUserController {
  24 +
  25 + @Resource
  26 + private SocialUserApi socialUserApi;
  27 +
  28 + @PostMapping("/bind")
  29 + @ApiOperation("社交绑定,使用 code 授权码")
  30 + public CommonResult<Boolean> socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) {
  31 + socialUserApi.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
  32 + return CommonResult.success(true);
  33 + }
  34 +
  35 + @DeleteMapping("/unbind")
  36 + @ApiOperation("取消社交绑定")
  37 + public CommonResult<Boolean> socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) {
  38 + socialUserApi.unbindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
  39 + return CommonResult.success(true);
  40 + }
  41 +
  42 +}
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialLoginReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialUserBindReqVO.java
1 -package cn.iocoder.yudao.module.member.controller.app.auth.vo; 1 +package cn.iocoder.yudao.module.member.controller.app.social.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
@@ -12,12 +12,12 @@ import lombok.NoArgsConstructor; @@ -12,12 +12,12 @@ import lombok.NoArgsConstructor;
12 import javax.validation.constraints.NotEmpty; 12 import javax.validation.constraints.NotEmpty;
13 import javax.validation.constraints.NotNull; 13 import javax.validation.constraints.NotNull;
14 14
15 -@ApiModel("用户 APP - 社交登录 Request VO,使用 code 授权码") 15 +@ApiModel("用户 APP - 社交绑定 Request VO,使用 code 授权码")
16 @Data 16 @Data
17 @NoArgsConstructor 17 @NoArgsConstructor
18 @AllArgsConstructor 18 @AllArgsConstructor
19 @Builder 19 @Builder
20 -public class AppAuthSocialLoginReqVO { 20 +public class AppSocialUserBindReqVO {
21 21
22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") 22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
23 @InEnum(SocialTypeEnum.class) 23 @InEnum(SocialTypeEnum.class)
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/auth/vo/AppAuthSocialUnbindReqVO.java renamed to yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/social/vo/AppSocialUserUnbindReqVO.java
1 -package cn.iocoder.yudao.module.member.controller.app.auth.vo; 1 +package cn.iocoder.yudao.module.member.controller.app.social.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
@@ -12,20 +12,20 @@ import lombok.NoArgsConstructor; @@ -12,20 +12,20 @@ import lombok.NoArgsConstructor;
12 import javax.validation.constraints.NotEmpty; 12 import javax.validation.constraints.NotEmpty;
13 import javax.validation.constraints.NotNull; 13 import javax.validation.constraints.NotNull;
14 14
15 -@ApiModel("用户 APP - 取消社交绑定 Request VO,使用 code 授权码") 15 +@ApiModel("用户 APP - 取消社交绑定 Request VO")
16 @Data 16 @Data
17 @NoArgsConstructor 17 @NoArgsConstructor
18 @AllArgsConstructor 18 @AllArgsConstructor
19 @Builder 19 @Builder
20 -public class AppAuthSocialUnbindReqVO { 20 +public class AppSocialUserUnbindReqVO {
21 21
22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值") 22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
23 @InEnum(SocialTypeEnum.class) 23 @InEnum(SocialTypeEnum.class)
24 @NotNull(message = "社交平台的类型不能为空") 24 @NotNull(message = "社交平台的类型不能为空")
25 private Integer type; 25 private Integer type;
26 26
27 - @ApiModelProperty(value = "社交的全局编号", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")  
28 - @NotEmpty(message = "社交的全局编号不能为空")  
29 - private String unionId; 27 + @ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
  28 + @NotEmpty(message = "社交用户的 openid 不能为空")
  29 + private String openid;
30 30
31 } 31 }
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/auth/AuthConvert.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.convert.auth; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.convert.auth;
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.security.core.LoginUser; 4 import cn.iocoder.yudao.framework.security.core.LoginUser;
5 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; 5 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
  6 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
6 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 7 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
7 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO; 8 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
8 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; 9 import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
@@ -26,10 +27,9 @@ public interface AuthConvert { @@ -26,10 +27,9 @@ public interface AuthConvert {
26 return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue()); 27 return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue());
27 } 28 }
28 29
29 - SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialBindReqVO reqVO);  
30 - SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLogin2ReqVO reqVO);  
31 - SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLoginReqVO reqVO);  
32 - SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppAuthSocialUnbindReqVO reqVO); 30 + SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialBindLoginReqVO reqVO);
  31 + SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialQuickLoginReqVO reqVO);
  32 + SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO);
33 33
34 SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO); 34 SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO);
35 SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp); 35 SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp);
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/social/SocialUserConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.convert.social;
  2 +
  3 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
  4 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
  5 +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
  6 +import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +@Mapper
  11 +public interface SocialUserConvert {
  12 +
  13 + SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
  14 +
  15 + SocialUserBindReqDTO convert(Long userId, Integer userType, AppSocialUserBindReqVO reqVO);
  16 +
  17 + SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO);
  18 +
  19 +}
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthService.java
@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.member.service.auth; @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.member.service.auth;
2 2
3 import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService; 3 import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
4 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; 4 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
  5 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
5 7
6 import javax.validation.Valid; 8 import javax.validation.Valid;
7 9
@@ -43,7 +45,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService { @@ -43,7 +45,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService {
43 * @param userAgent 用户 UA 45 * @param userAgent 用户 UA
44 * @return 身份令牌,使用 JWT 方式 46 * @return 身份令牌,使用 JWT 方式
45 */ 47 */
46 - String socialLogin(@Valid AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent); 48 + String socialQuickLogin(@Valid AppAuthSocialQuickLoginReqVO reqVO, String userIp, String userAgent);
47 49
48 /** 50 /**
49 * 社交登录,使用 手机号 + 手机验证码 51 * 社交登录,使用 手机号 + 手机验证码
@@ -53,23 +55,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService { @@ -53,23 +55,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService {
53 * @param userAgent 用户 UA 55 * @param userAgent 用户 UA
54 * @return 身份令牌,使用 JWT 方式 56 * @return 身份令牌,使用 JWT 方式
55 */ 57 */
56 - String socialLogin2(@Valid AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent);  
57 -  
58 - /**  
59 - * 社交绑定,使用 code 授权码  
60 - *  
61 - * @param userId 用户编号  
62 - * @param reqVO 绑定信息  
63 - */  
64 - void socialBind(Long userId, @Valid AppAuthSocialBindReqVO reqVO);  
65 -  
66 - /**  
67 - * 取消社交绑定  
68 - *  
69 - * @param userId 用户编号  
70 - * @param reqVO 解绑信息  
71 - */  
72 - void unbindSocialUser(Long userId, @Valid AppAuthSocialUnbindReqVO reqVO); 58 + String socialBindLogin(@Valid AppAuthSocialBindLoginReqVO reqVO, String userIp, String userAgent);
73 59
74 /** 60 /**
75 * 获得社交认证 URL 61 * 获得社交认证 URL
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/auth/MemberAuthServiceImpl.java
@@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils; @@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
8 import cn.iocoder.yudao.framework.security.core.LoginUser; 8 import cn.iocoder.yudao.framework.security.core.LoginUser;
9 import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken; 9 import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken;
10 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*; 10 import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
  11 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
  12 +import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
11 import cn.iocoder.yudao.module.member.convert.auth.AuthConvert; 13 import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
12 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; 14 import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
13 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; 15 import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
@@ -108,7 +110,7 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -108,7 +110,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
108 } 110 }
109 111
110 @Override 112 @Override
111 - public String socialLogin(AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent) { 113 + public String socialQuickLogin(AppAuthSocialQuickLoginReqVO reqVO, String userIp, String userAgent) {
112 // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号 114 // 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
113 Long userId = socialUserApi.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(), 115 Long userId = socialUserApi.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
114 reqVO.getCode(), reqVO.getState()); 116 reqVO.getCode(), reqVO.getState());
@@ -125,25 +127,19 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -125,25 +127,19 @@ public class MemberAuthServiceImpl implements MemberAuthService {
125 // 创建 LoginUser 对象 127 // 创建 LoginUser 对象
126 LoginUser loginUser = AuthConvert.INSTANCE.convert(user); 128 LoginUser loginUser = AuthConvert.INSTANCE.convert(user);
127 129
128 - // 绑定社交用户(更新)  
129 - socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO));  
130 -  
131 // 缓存登录用户到 Redis 中,返回 sessionId 编号 130 // 缓存登录用户到 Redis 中,返回 sessionId 编号
132 return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent); 131 return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent);
133 } 132 }
134 133
135 @Override 134 @Override
136 - public String socialLogin2(AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) {  
137 - // 校验社交平台的认证信息是否正确  
138 - socialUserApi.checkSocialUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());  
139 - 135 + public String socialBindLogin(AppAuthSocialBindLoginReqVO reqVO, String userIp, String userAgent) {
140 // 使用手机号、手机验证码登录 136 // 使用手机号、手机验证码登录
141 AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder() 137 AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder()
142 .mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build(); 138 .mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build();
143 String sessionId = this.smsLogin(loginReqVO, userIp, userAgent); 139 String sessionId = this.smsLogin(loginReqVO, userIp, userAgent);
144 LoginUser loginUser = userSessionApi.getLoginUser(sessionId); 140 LoginUser loginUser = userSessionApi.getLoginUser(sessionId);
145 141
146 - // 绑定社交用户(新增) 142 + // 绑定社交用户
147 socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO)); 143 socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO));
148 return sessionId; 144 return sessionId;
149 } 145 }
@@ -156,17 +152,6 @@ public class MemberAuthServiceImpl implements MemberAuthService { @@ -156,17 +152,6 @@ public class MemberAuthServiceImpl implements MemberAuthService {
156 } 152 }
157 153
158 @Override 154 @Override
159 - public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) {  
160 - // 绑定社交用户(新增)  
161 - socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO));  
162 - }  
163 -  
164 - @Override  
165 - public void unbindSocialUser(Long userId, AppAuthSocialUnbindReqVO reqVO) {  
166 - socialUserApi.unbindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO));  
167 - }  
168 -  
169 - @Override  
170 public String getSocialAuthorizeUrl(Integer type, String redirectUri) { 155 public String getSocialAuthorizeUrl(Integer type, String redirectUri) {
171 return socialUserApi.getAuthorizeUrl(type, redirectUri); 156 return socialUserApi.getAuthorizeUrl(type, redirectUri);
172 } 157 }
yudao-module-system/yudao-module-system-api/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApi.java
@@ -38,20 +38,9 @@ public interface SocialUserApi { @@ -38,20 +38,9 @@ public interface SocialUserApi {
38 void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO); 38 void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO);
39 39
40 /** 40 /**
41 - * 校验社交用户的认证信息是否正确  
42 - * 如果校验不通过,则抛出 {@link ServiceException} 业务异常  
43 - *  
44 - * @param type 社交平台的类型  
45 - * @param code 授权码  
46 - * @param state state  
47 - */  
48 - void checkSocialUser(Integer type, String code, String state);  
49 -  
50 - /**  
51 * 获得社交用户的绑定用户编号 41 * 获得社交用户的绑定用户编号
52 * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号! 42 * 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号!
53 - * 该方法会执行和 {@link #checkSocialUser(Integer, String, String)} 一样的逻辑。  
54 - * 所以在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常 43 + * 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
55 * 44 *
56 * @param userType 用户类型 45 * @param userType 用户类型
57 * @param type 社交平台的类型 46 * @param type 社交平台的类型
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/api/social/SocialUserApiImpl.java
@@ -37,11 +37,6 @@ public class SocialUserApiImpl implements SocialUserApi { @@ -37,11 +37,6 @@ public class SocialUserApiImpl implements SocialUserApi {
37 } 37 }
38 38
39 @Override 39 @Override
40 - public void checkSocialUser(Integer type, String code, String state) {  
41 - socialUserService.authSocialUser(type, code, state);  
42 - }  
43 -  
44 - @Override  
45 public Long getBindUserId(Integer userType, Integer type, String code, String state) { 40 public Long getBindUserId(Integer userType, Integer type, String code, String state) {
46 return socialUserService.getBindUserId(userType, type, code, state); 41 return socialUserService.getBindUserId(userType, type, code, state);
47 } 42 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/SocialUserController.java
@@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.socail; @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.socail;
2 2
3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; 3 import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
4 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 4 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
5 -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;  
6 -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialUnbindReqVO; 5 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
7 import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert; 7 import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert;
8 import cn.iocoder.yudao.module.system.service.social.SocialUserService; 8 import cn.iocoder.yudao.module.system.service.social.SocialUserService;
9 import io.swagger.annotations.Api; 9 import io.swagger.annotations.Api;
@@ -27,15 +27,15 @@ public class SocialUserController { @@ -27,15 +27,15 @@ public class SocialUserController {
27 27
28 @PostMapping("/bind") 28 @PostMapping("/bind")
29 @ApiOperation("社交绑定,使用 code 授权码") 29 @ApiOperation("社交绑定,使用 code 授权码")
30 - public CommonResult<Boolean> socialBind(@RequestBody @Valid AuthSocialBindReqVO reqVO) { 30 + public CommonResult<Boolean> socialBind(@RequestBody @Valid SocialUserBindReqVO reqVO) {
31 socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO)); 31 socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO));
32 return CommonResult.success(true); 32 return CommonResult.success(true);
33 } 33 }
34 34
35 @DeleteMapping("/unbind") 35 @DeleteMapping("/unbind")
36 @ApiOperation("取消社交绑定") 36 @ApiOperation("取消社交绑定")
37 - public CommonResult<Boolean> socialUnbind(@RequestBody AuthSocialUnbindReqVO reqVO) {  
38 - socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getUnionId()); 37 + public CommonResult<Boolean> socialUnbind(@RequestBody SocialUserUnbindReqVO reqVO) {
  38 + socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getOpenid());
39 return CommonResult.success(true); 39 return CommonResult.success(true);
40 } 40 }
41 41
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialBindReqVO.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/SocialUserBindReqVO.java
1 -package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; 1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo;
2 2
3 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 3 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
4 import cn.iocoder.yudao.framework.common.validation.InEnum; 4 import cn.iocoder.yudao.framework.common.validation.InEnum;
@@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull; @@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull;
17 @NoArgsConstructor 17 @NoArgsConstructor
18 @AllArgsConstructor 18 @AllArgsConstructor
19 @Builder 19 @Builder
20 -public class AuthSocialBindReqVO { 20 +public class SocialUserBindReqVO {
21 21
22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") 22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
23 @InEnum(SocialTypeEnum.class) 23 @InEnum(SocialTypeEnum.class)
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/auth/vo/auth/AuthSocialUnbindReqVO.java renamed to yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/socail/vo/SocialUserUnbindReqVO.java
1 -package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth; 1 +package cn.iocoder.yudao.module.system.controller.admin.socail.vo;
2 2
3 import cn.iocoder.yudao.framework.common.validation.InEnum; 3 import cn.iocoder.yudao.framework.common.validation.InEnum;
4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum; 4 import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
@@ -12,20 +12,20 @@ import lombok.NoArgsConstructor; @@ -12,20 +12,20 @@ import lombok.NoArgsConstructor;
12 import javax.validation.constraints.NotEmpty; 12 import javax.validation.constraints.NotEmpty;
13 import javax.validation.constraints.NotNull; 13 import javax.validation.constraints.NotNull;
14 14
15 -@ApiModel("管理后台 - 取消社交绑定 Request VO,使用 code 授权码") 15 +@ApiModel("管理后台 - 取消社交绑定 Request VO")
16 @Data 16 @Data
17 @NoArgsConstructor 17 @NoArgsConstructor
18 @AllArgsConstructor 18 @AllArgsConstructor
19 @Builder 19 @Builder
20 -public class AuthSocialUnbindReqVO { 20 +public class SocialUserUnbindReqVO {
21 21
22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值") 22 @ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
23 @InEnum(SocialTypeEnum.class) 23 @InEnum(SocialTypeEnum.class)
24 @NotNull(message = "社交平台的类型不能为空") 24 @NotNull(message = "社交平台的类型不能为空")
25 private Integer type; 25 private Integer type;
26 26
27 - @ApiModelProperty(value = "社交的全局编号", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")  
28 - @NotEmpty(message = "社交的全局编号不能为空")  
29 - private String unionId; 27 + @ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
  28 + @NotEmpty(message = "社交用户的 openid 不能为空")
  29 + private String openid;
30 30
31 } 31 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/convert/social/SocialUserConvert.java
@@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.convert.social; @@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.convert.social;
2 2
3 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO; 3 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
4 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO; 4 import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
5 -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;  
6 -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialUnbindReqVO; 5 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
  6 +import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
7 import org.mapstruct.Mapper; 7 import org.mapstruct.Mapper;
8 import org.mapstruct.factory.Mappers; 8 import org.mapstruct.factory.Mappers;
9 9
@@ -12,8 +12,8 @@ public interface SocialUserConvert { @@ -12,8 +12,8 @@ public interface SocialUserConvert {
12 12
13 SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class); 13 SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
14 14
15 - SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialBindReqVO reqVO); 15 + SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO);
16 16
17 - SocialUserUnbindReqDTO convert(Long userId, Integer userType, AuthSocialUnbindReqVO reqVO); 17 + SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO);
18 18
19 } 19 }
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/auth/AdminAuthServiceImpl.java
@@ -10,7 +10,6 @@ import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePass @@ -10,7 +10,6 @@ import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePass
10 import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO; 10 import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
11 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO; 11 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO;
12 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindLoginReqVO; 12 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindLoginReqVO;
13 -import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;  
14 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialQuickLoginReqVO; 13 import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialQuickLoginReqVO;
15 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert; 14 import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
16 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; 15 import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
yudao-ui-admin/src/api/system/socialUser.js
@@ -14,13 +14,13 @@ export function socialBind(type, code, state) { @@ -14,13 +14,13 @@ export function socialBind(type, code, state) {
14 } 14 }
15 15
16 // 取消社交绑定 16 // 取消社交绑定
17 -export function socialUnbind(type, unionId) { 17 +export function socialUnbind(type, openid) {
18 return request({ 18 return request({
19 url: '/system/social-user/unbind', 19 url: '/system/social-user/unbind',
20 method: 'delete', 20 method: 'delete',
21 data: { 21 data: {
22 type, 22 type,
23 - unionId 23 + openid
24 } 24 }
25 }) 25 })
26 } 26 }