Browse Source

fix 酷乐秀扫码登录

Eric 7 months ago
parent
commit
74e4b3e771

+ 15 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/SysUserFeignService.java

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.auth.api.client;
 
+import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
 import com.yonge.cooleshow.auth.api.client.fallback.SysUserFeignServiceFallback;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
@@ -17,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.util.List;
+import java.util.Map;
 
 @FeignClient(contextId = "sysUserFeignService", name = "${app-config.open-feign.auth-server.name:auth-server}", url = "${app-config.open-feign.auth-server.url:}",
 		configuration = { FeignConfiguration.class }, fallback = SysUserFeignServiceFallback.class)
@@ -83,4 +85,17 @@ public interface SysUserFeignService {
 	@ApiOperation(value = "获取登录用户client")
 	HttpResponseResult<String> client();
 
+	@PostMapping(value = "open/qrcode/userInfo")
+	CbsQrCodeScanWrapper.UserInfo userInfo(@RequestBody CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req);
+
+	@PostMapping(value = "open/qrcode/login")
+	CbsQrCodeScanWrapper.QrCodeScanToken login(@RequestBody CbsQrCodeScanWrapper.QrCodeScanReq req);
+
+	@PostMapping(value = "smsLogin")
+	HttpResponseResult<Map<String,Object>> smsLogin(@RequestParam("phone")String phone,
+													@RequestParam("smsCode")String smsCode,
+													@RequestParam("loginType")String loginType,
+													@RequestParam("clientId")String clientId,
+													@RequestParam("clientSecret")String clientSecret);
+
 }

+ 32 - 0
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/client/fallback/SysUserFeignServiceFallback.java

@@ -1,7 +1,9 @@
 package com.yonge.cooleshow.auth.api.client.fallback;
 
 import java.util.List;
+import java.util.Map;
 
+import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
@@ -97,4 +99,34 @@ public class SysUserFeignServiceFallback implements SysUserFeignService {
 		return null;
 	}
 
+	/**
+	 * @param req
+	 * @return
+	 */
+	@Override
+	public CbsQrCodeScanWrapper.UserInfo userInfo(CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req) {
+		return null;
+	}
+
+	/**
+	 * @param req
+	 * @return
+	 */
+	@Override
+	public CbsQrCodeScanWrapper.QrCodeScanToken login(CbsQrCodeScanWrapper.QrCodeScanReq req) {
+		return null;
+	}
+
+	/**
+	 * @param phone
+	 * @param smsCode
+	 * @param clientId
+	 * @param loginType
+	 * @param clientSecret
+	 * @return
+	 */
+	@Override
+	public HttpResponseResult<Map<String, Object>> smsLogin(String phone, String smsCode, String loginType, String clientId, String clientSecret) {
+		return null;
+	}
 }

+ 23 - 4
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/core/provider/PhoneAuthenticationProvider.java

@@ -142,10 +142,29 @@ public class PhoneAuthenticationProvider extends AbstractAuthenticationProvider
                 }
 
             } else {
-                // 验证码验证
-                boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");
-                if (!b) {
-                    throw new BadCredentialsException("验证码校验失败");
+                if (loginEntity.getClientId().toLowerCase().startsWith("qr_")) {
+                    // 授权authToken登录
+                    /*try {
+                        RSAPublicKey rsaPublicKey = RsaKeyHelper.getRSAPublicKey("jmedu", "dayaedu", "jmedu.jks", "dayaedu");
+                        Jwt jwt = JwtHelper.decodeAndVerify(smsCode, new RsaVerifier(rsaPublicKey));
+
+                        //获取jwt原始内容
+                        String claims = jwt.getClaims();
+                        if (StringUtils.isEmpty(claims)) {
+                            throw new BadCredentialsException("扫码登录授权校验失败");
+                        }
+                        log.info("SCAN_QRCODE_USER claims={}", claims);
+                    } catch (Exception e) {
+                        log.error("SCAN_QRCODE_USER code={}", smsCode, e);
+                    }*/
+                    // 重置登录账号信息
+                    loginEntity.setClientId(loginEntity.getClientId().replace("qr_", "").toUpperCase());
+                } else {
+                    // 验证码验证
+                    boolean b = smsCodeService.verifyValidCode(phone, smsCode, "SMS_VERIFY_CODE_LOGIN");
+                    if (!b) {
+                        throw new BadCredentialsException("验证码校验失败");
+                    }
                 }
             }
 

+ 67 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/CbsQrCodeScanServiceImpl.java

@@ -0,0 +1,67 @@
+package com.yonge.cooleshow.auth.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.auth.core.service.CustomTokenServices;
+import com.yonge.cooleshow.auth.dal.dao.SysConfigDao;
+import com.yonge.cooleshow.auth.service.SysUserService;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpStatus;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.Map;
+import java.util.UUID;
+
+@Service
+public class CbsQrCodeScanServiceImpl {
+
+    @Resource
+    private CustomTokenServices customTokenServices;
+    @Resource
+    private SysUserService sysUserService;
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+    @Resource
+    private SysConfigDao sysConfigDao;
+
+    public CbsQrCodeScanWrapper.UserInfo userInfo(CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req) {
+        CbsQrCodeScanWrapper.UserInfo userInfo = new CbsQrCodeScanWrapper.UserInfo();
+        userInfo.setUsername(customTokenServices.loadAuthentication(req.getToken()).getName().split(":")[1]);
+        userInfo.setClientTypes("TEACHER");
+        return userInfo;
+    }
+
+    public CbsQrCodeScanWrapper.QrCodeScanToken login(CbsQrCodeScanWrapper.QrCodeScanReq req) {
+        //校验是否过期
+        OAuth2Authentication auth2Authentication = customTokenServices.loadAuthentication(req.getPassword());
+        String phone = auth2Authentication.getName().split(":")[1];
+        SysUser sysUser = sysUserService.queryByPhone(phone);
+        if (sysUser == null) {
+            throw new BizException(HttpStatus.UNAUTHORIZED.value(), "用户不存在");
+        }
+        //获取需要排除的用户编号
+        String excludeUserIds = sysConfigDao.findConfigValue("exclude_user_ids");
+        if(StringUtils.isNotEmpty(excludeUserIds) && excludeUserIds.contains(sysUser.getId().toString())){
+            throw new BizException("扫码登陆失败: 用户已锁定");
+        }
+
+        //调用登陆接口
+        HttpResponseResult<Map<String,Object>> result = sysUserFeignService.smsLogin(phone, UUID.randomUUID().toString(),"SMS", req.getClientId(), req.getClientSecret());
+        if (result != null){
+            if(result.getCode() != 200){
+                throw new BizException("扫码登陆失败", result.getMsg());
+            }
+            CbsQrCodeScanWrapper.QrCodeScanToken qrCodeScanToken = new CbsQrCodeScanWrapper.QrCodeScanToken();
+            JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(result.getData().get("authentication")));
+            qrCodeScanToken.setTokenData(jsonObject.getString("access_token"));
+            return qrCodeScanToken;
+        }
+        throw new BizException("扫码登陆失败", "调用登陆接口失败");
+    }
+}

+ 33 - 0
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/OpenQrLoginController.java

@@ -0,0 +1,33 @@
+package com.yonge.cooleshow.auth.web.controller;
+
+import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
+import com.yonge.cooleshow.auth.service.impl.CbsQrCodeScanServiceImpl;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@Api(tags = "扫码登陆")
+@RequestMapping(value = "/open")
+public class OpenQrLoginController {
+
+	@Resource
+	private CbsQrCodeScanServiceImpl cbsQrCodeScanService;
+
+	@ApiOperation(value = "获取用户信息")
+	@PostMapping(value = "/qrcode/userInfo")
+	public CbsQrCodeScanWrapper.UserInfo userInfo(@RequestBody CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req) {
+		return cbsQrCodeScanService.userInfo(req);
+	}
+
+	@ApiOperation(value = "生成token")
+	@PostMapping(value = "/qrcode/login")
+	public CbsQrCodeScanWrapper.QrCodeScanToken login(@RequestBody CbsQrCodeScanWrapper.QrCodeScanReq req) {
+		return cbsQrCodeScanService.login(req);
+	}
+}

+ 0 - 2
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/TokenController.java

@@ -1,6 +1,5 @@
 package com.yonge.cooleshow.auth.web.controller;
 
-import cn.hutool.core.net.URLEncodeUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -46,7 +45,6 @@ import org.springframework.web.client.RestTemplate;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
-import java.text.MessageFormat;
 import java.util.Base64;
 import java.util.Calendar;
 import java.util.Locale;

+ 8 - 0
cooleshow-auth/pom.xml

@@ -25,4 +25,12 @@
         <module>auth-api</module>
         <module>auth-server</module>
     </modules>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.dayaedu.cbs.openfeign</groupId>
+            <artifactId>dayaedu-openfeign-api</artifactId>
+            <version>${cbs.version}</version>
+        </dependency>
+    </dependencies>
 </project>

+ 25 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/cbs/impl/CbsQrCodeScanServiceImpl.java

@@ -0,0 +1,25 @@
+package com.yonge.cooleshow.biz.dal.service.cbs.impl;
+
+import com.dayaedu.cbs.openfeign.service.CbsQrCodeScanService;
+import com.dayaedu.cbs.openfeign.wrapper.qrcode.CbsQrCodeScanWrapper;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+@Service
+public class CbsQrCodeScanServiceImpl implements CbsQrCodeScanService {
+
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Override
+    public CbsQrCodeScanWrapper.UserInfo userInfo(CbsQrCodeScanWrapper.QrCodeScanUserInfoReq req) {
+        return sysUserFeignService.userInfo(req);
+    }
+
+    @Override
+    public CbsQrCodeScanWrapper.QrCodeScanToken login(CbsQrCodeScanWrapper.QrCodeScanReq req) {
+        return sysUserFeignService.login(req);
+    }
+}