APP第三方信任登录通过unionid进行登录

This commit is contained in:
pikachu1995@126.com 2023-03-09 15:39:50 +08:00
parent 6f746e3aff
commit f506fa86cc
9 changed files with 80 additions and 41 deletions

View File

@ -75,25 +75,14 @@ public class ConnectBuyerWebController {
return connectUtil.getResult(state); return connectUtil.getResult(state);
} }
// @GetMapping("/register/auto") @ApiOperation(value = "APP-unionID登录")
// @ApiOperation(value = "WEB信任登录授权")
// public ResultMessage<Token> webAuthorize() {
// Token token = memberService.autoRegister();
// return ResultUtil.data(token);
// }
@ApiOperation(value = "unionID登录")
@ApiImplicitParams({
@ApiImplicitParam(name = "openId", value = "openid", required = true, paramType = "query"),
@ApiImplicitParam(name = "type", value = "联合类型", required = true,
allowableValues = "WECHAT,QQ,ALIPAY,WEIBO,APPLE", paramType = "query"),
@ApiImplicitParam(name = "uniAccessToken", value = "联合登陆返回的accessToken", required = true, paramType = "query")
})
@GetMapping("/app/login") @GetMapping("/app/login")
public ResultMessage<Token> unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) { public ResultMessage<Token> unionLogin(ConnectAuthUser authUser, @RequestHeader("uuid") String uuid) {
try { try {
System.out.println(1);
return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid)); return ResultUtil.data(connectService.unionLoginCallback(authUser, uuid));
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace();
log.error("unionID登录错误", e); log.error("unionID登录错误", e);
} }
return null; return null;

View File

@ -1,9 +1,12 @@
package cn.lili.event.impl; package cn.lili.event.impl;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.event.MemberConnectLoginEvent; import cn.lili.event.MemberConnectLoginEvent;
import cn.lili.event.MemberLoginEvent; import cn.lili.event.MemberLoginEvent;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.service.MemberService; import cn.lili.modules.member.service.MemberService;
@ -38,11 +41,12 @@ public class MemberExecute implements MemberLoginEvent, MemberConnectLoginEvent
//保存UnionID //保存UnionID
if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) { if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) {
connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getType()); connectService.loginBindUser(member.getId(), authUser.getToken().getUnionId(), authUser.getSource());
} }
//保存OpenID //保存OpenID
if (StrUtil.isNotBlank(authUser.getUuid())) { if (StrUtil.isNotBlank(authUser.getUuid())) {
connectService.loginBindUser(member.getId(), authUser.getUuid(), authUser.getType()); SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getSource()), ClientTypeEnum.valueOf(authUser.getType()));
connectService.loginBindUser(member.getId(), authUser.getUuid(), sourceEnum.name());
} }
} }

View File

@ -31,7 +31,7 @@ public enum ClientTypeEnum {
*/ */
UNKNOWN("未知"); UNKNOWN("未知");
private final String clientName; private String clientName;
ClientTypeEnum(String des) { ClientTypeEnum(String des) {
this.clientName = des; this.clientName = des;

View File

@ -67,11 +67,7 @@ public class ConnectAuthUser implements Serializable {
* 用户来源 * 用户来源
*/ */
private String source; private String source;
/**
* 用户来源
* 例如微信支付宝微博
*/
private String source1;
/** /**
* 类型 * 类型
* 例如PCWAP小程序 * 例如PCWAP小程序

View File

@ -1,5 +1,7 @@
package cn.lili.modules.connect.entity.enums; package cn.lili.modules.connect.entity.enums;
import cn.lili.common.enums.ClientTypeEnum;
/** /**
* 联合登陆-渠道枚举 * 联合登陆-渠道枚举
* *
@ -13,6 +15,12 @@ public enum SourceEnum {
WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"), WECHAT_OFFIACCOUNT_OPEN_ID("微信公众号 openid登录"),
WECHAT_MP_OPEN_ID("微信小程序 openid登录"), WECHAT_MP_OPEN_ID("微信小程序 openid登录"),
WECHAT_APP_OPEN_ID("微信APP openid登录"), WECHAT_APP_OPEN_ID("微信APP openid登录"),
QQ_APP_OPEN_ID("QQ APP openid登录"),
QQ_PC_OPEN_ID("QQ PC应用 openid登录"),
QQ_H5_OPEN_ID("QQ H5应用 openid登录"),
APPLE_OPEN_ID("苹果 openid登录"),
; ;
@ -21,4 +29,34 @@ public enum SourceEnum {
SourceEnum(String description) { SourceEnum(String description) {
this.description = description; this.description = description;
} }
public static SourceEnum getSourceEnum(ConnectEnum source, ClientTypeEnum type) {
switch (source) {
case WECHAT:
switch (type) {
case APP:
return WECHAT_APP_OPEN_ID;
case WECHAT_MP:
return WECHAT_MP_OPEN_ID;
case PC:
return WECHAT_PC_OPEN_ID;
case H5:
return WECHAT_OFFIACCOUNT_OPEN_ID;
}
break;
case QQ:
switch (type) {
case APP:
return QQ_APP_OPEN_ID;
case PC:
return QQ_PC_OPEN_ID;
case H5:
return QQ_H5_OPEN_ID;
}
break;
case APPLE:
return APPLE_OPEN_ID;
}
return null;
}
} }

View File

@ -2,6 +2,8 @@ package cn.lili.modules.connect.request;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.StringUtils; import cn.lili.common.utils.StringUtils;
import cn.lili.common.utils.UrlBuilder; import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.AuthConfig;
@ -12,9 +14,9 @@ import cn.lili.modules.connect.entity.dto.AuthToken;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.enums.AuthResponseStatus; import cn.lili.modules.connect.entity.enums.AuthResponseStatus;
import cn.lili.modules.connect.entity.enums.AuthUserGender; import cn.lili.modules.connect.entity.enums.AuthUserGender;
import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.util.GlobalAuthUtils; import cn.lili.modules.connect.util.GlobalAuthUtils;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import java.util.Map; import java.util.Map;
@ -67,7 +69,8 @@ public class BaseAuthQQRequest extends BaseAuthRequest {
.uuid(openId) .uuid(openId)
.gender(AuthUserGender.getRealGender(object.getString("gender"))) .gender(AuthUserGender.getRealGender(object.getString("gender")))
.token(authToken) .token(authToken)
.source(source.toString()) .source(ConnectEnum.QQ.name())
.type(ClientTypeEnum.PC.name())
.build(); .build();
} }

View File

@ -1,6 +1,8 @@
package cn.lili.modules.connect.request; package cn.lili.modules.connect.request;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.UrlBuilder; import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.AuthConfig;
import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -13,7 +15,6 @@ import cn.lili.modules.connect.entity.enums.AuthUserGender;
import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.exception.AuthException;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
/** /**
@ -61,8 +62,8 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest {
.uuid(authToken.getOpenId()) .uuid(authToken.getOpenId())
.gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .gender(AuthUserGender.getWechatRealGender(object.getString("sex")))
.token(authToken) .token(authToken)
.source(source.toString()) .source(ConnectEnum.WECHAT.name())
.source1(ConnectEnum.WECHAT.name()) .type(ClientTypeEnum.H5.name())
.type(SourceEnum.WECHAT_PC_OPEN_ID.name()) .type(SourceEnum.WECHAT_PC_OPEN_ID.name())
.build(); .build();
} }
@ -116,6 +117,7 @@ public class BaseAuthWeChatPCRequest extends BaseAuthRequest {
*/ */
@Override @Override
public String authorize(String state) { public String authorize(String state) {
return UrlBuilder.fromBaseUrl(source.authorize()) return UrlBuilder.fromBaseUrl(source.authorize())
.queryParam("response_type", "code") .queryParam("response_type", "code")
.queryParam("appid", config.getClientId()) .queryParam("appid", config.getClientId())

View File

@ -1,6 +1,8 @@
package cn.lili.modules.connect.request; package cn.lili.modules.connect.request;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.utils.HttpUtils;
import cn.lili.common.utils.UrlBuilder; import cn.lili.common.utils.UrlBuilder;
import cn.lili.modules.connect.config.AuthConfig; import cn.lili.modules.connect.config.AuthConfig;
import cn.lili.modules.connect.config.ConnectAuthEnum; import cn.lili.modules.connect.config.ConnectAuthEnum;
@ -14,7 +16,6 @@ import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum; import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.exception.AuthException; import cn.lili.modules.connect.exception.AuthException;
import cn.lili.modules.connect.util.GlobalAuthUtils; import cn.lili.modules.connect.util.GlobalAuthUtils;
import cn.lili.common.utils.HttpUtils;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
/** /**
@ -63,8 +64,8 @@ public class BaseAuthWeChatRequest extends BaseAuthRequest {
.uuid(openId) .uuid(openId)
.gender(AuthUserGender.getWechatRealGender(object.getString("sex"))) .gender(AuthUserGender.getWechatRealGender(object.getString("sex")))
.token(authToken) .token(authToken)
.source(source.toString()) .source(ConnectEnum.WECHAT.name())
.source1(ConnectEnum.WECHAT.name()) .type(ClientTypeEnum.H5.name())
.type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name()) .type(SourceEnum.WECHAT_OFFIACCOUNT_OPEN_ID.name())
.build(); .build();
} }

View File

@ -1,26 +1,25 @@
package cn.lili.modules.connect.serviceimpl; package cn.lili.modules.connect.serviceimpl;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import cn.lili.cache.Cache; import cn.lili.cache.Cache;
import cn.lili.cache.CachePrefix; import cn.lili.cache.CachePrefix;
import cn.lili.common.context.ThreadContextHolder;
import cn.lili.common.enums.ClientTypeEnum; import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.enums.ResultCode; import cn.lili.common.enums.ResultCode;
import cn.lili.common.event.TransactionCommitSendMQEvent;
import cn.lili.common.exception.ServiceException; import cn.lili.common.exception.ServiceException;
import cn.lili.common.properties.RocketmqCustomProperties; import cn.lili.common.properties.RocketmqCustomProperties;
import cn.lili.common.security.AuthUser; import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext; import cn.lili.common.security.context.UserContext;
import cn.lili.common.security.token.Token; import cn.lili.common.security.token.Token;
import cn.lili.common.utils.CookieUtil;
import cn.lili.common.utils.HttpUtils; import cn.lili.common.utils.HttpUtils;
import cn.lili.modules.connect.entity.Connect; import cn.lili.modules.connect.entity.Connect;
import cn.lili.modules.connect.entity.dto.ConnectAuthUser; import cn.lili.modules.connect.entity.dto.ConnectAuthUser;
import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage; import cn.lili.modules.connect.entity.dto.MemberConnectLoginMessage;
import cn.lili.modules.connect.entity.dto.WechatMPLoginParams; import cn.lili.modules.connect.entity.dto.WechatMPLoginParams;
import cn.lili.modules.connect.entity.enums.ConnectEnum; import cn.lili.modules.connect.entity.enums.ConnectEnum;
import cn.lili.modules.connect.entity.enums.SourceEnum;
import cn.lili.modules.connect.mapper.ConnectMapper; import cn.lili.modules.connect.mapper.ConnectMapper;
import cn.lili.modules.connect.service.ConnectService; import cn.lili.modules.connect.service.ConnectService;
import cn.lili.modules.member.entity.dos.Member; import cn.lili.modules.member.entity.dos.Member;
@ -33,7 +32,6 @@ import cn.lili.modules.system.entity.dto.connect.dto.WechatConnectSettingItem;
import cn.lili.modules.system.entity.enums.SettingEnum; import cn.lili.modules.system.entity.enums.SettingEnum;
import cn.lili.modules.system.service.SettingService; import cn.lili.modules.system.service.SettingService;
import cn.lili.rocketmq.RocketmqSendCallbackBuilder; import cn.lili.rocketmq.RocketmqSendCallbackBuilder;
import cn.lili.rocketmq.tags.GoodsTagsEnum;
import cn.lili.rocketmq.tags.MemberTagsEnum; import cn.lili.rocketmq.tags.MemberTagsEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@ -41,7 +39,6 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate; import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -53,7 +50,6 @@ import java.nio.charset.StandardCharsets;
import java.security.AlgorithmParameters; import java.security.AlgorithmParameters;
import java.security.Security; import java.security.Security;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit;
/** /**
* 联合登陆接口实现 * 联合登陆接口实现
@ -88,7 +84,6 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) { public Token unionLoginCallback(ConnectAuthUser authUser, String uuid) {
return this.unionLoginCallback(authUser, false); return this.unionLoginCallback(authUser, false);
} }
@ -249,11 +244,20 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
*/ */
private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) { private Token unionLoginCallback(ConnectAuthUser authUser, boolean longTerm) {
//使用UnionId登录
try { try {
LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<Connect>() LambdaQueryWrapper<Connect> queryWrapper = new LambdaQueryWrapper<Connect>();
.eq(Connect::getUnionId, authUser.getToken().getUnionId()) //使用UnionId登录
.eq(Connect::getUnionType, authUser.getSource1()); if (StrUtil.isNotBlank(authUser.getToken().getUnionId())) {
queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId())
.eq(Connect::getUnionType, authUser.getSource());
} else {
//使用OpenID登录
SourceEnum sourceEnum = SourceEnum.getSourceEnum(ConnectEnum.valueOf(authUser.getType()), ClientTypeEnum.valueOf(authUser.getSource()));
queryWrapper.eq(Connect::getUnionId, authUser.getToken().getUnionId())
.eq(Connect::getUnionType, sourceEnum.name());
}
//查询绑定关系 //查询绑定关系
Connect connect = this.getOne(queryWrapper); Connect connect = this.getOne(queryWrapper);
Member member = new Member(); Member member = new Member();
@ -353,4 +357,6 @@ public class ConnectServiceImpl extends ServiceImpl<ConnectMapper, Connect> impl
} }
throw new ServiceException(ResultCode.USER_CONNECT_ERROR); throw new ServiceException(ResultCode.USER_CONNECT_ERROR);
} }
} }