新增人脸核身解密功能 #60

Merged
bgy merged 5 commits from bgy into dev 2023-10-11 10:13:17 +00:00
6 changed files with 208 additions and 142 deletions
@@ -26,8 +26,7 @@ import com.ruoyi.system.service.ISysMenuService;
* @author ruoyi * @author ruoyi
*/ */
@RestController @RestController
public class SysLoginController public class SysLoginController {
{
@Autowired @Autowired
private SysLoginService loginService; private SysLoginService loginService;
@@ -37,7 +36,7 @@ public class SysLoginController
@Autowired @Autowired
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Autowired @Autowired
private IdentityAuthenticationService identityAuthenticationService; IdentityAuthenticationService identityAuthenticationService;
/** /**
* 登录方法 * 登录方法
@@ -46,20 +45,17 @@ public class SysLoginController
* @return 结果 * @return 结果
*/ */
@PostMapping("/login") @PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody) public AjaxResult login(@RequestBody LoginBody loginBody) {
{
AjaxResult ajax = AjaxResult.success(); AjaxResult ajax = AjaxResult.success();
// 生成令牌 // 生成令牌
String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(), String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
loginBody.getUuid()); loginBody.getUuid());
ajax.put(Constants.TOKEN, token); ajax.put(Constants.TOKEN, token);
//判断该用户是否已经实名认证(certificationStatus1已认证0未认证)
// IdentityAuthentication identityAuthentication = new IdentityAuthentication(); IdentityAuthentication identityAuthentication=new IdentityAuthentication();
// identityAuthentication.setUserName(loginBody.getUsername()); identityAuthentication.setUserName(loginBody.getUsername());
// IdentityAuthentication identityAuthenticationselect = identityAuthenticationService.selectIdentityAuthentication(identityAuthentication); String status = identityAuthenticationService.checkIsAuthentication(identityAuthentication);
// ajax.put("certificationStatusName", identityAuthenticationselect.getCertificationStatusName()); ajax.put("certificationStatus", status);
// ajax.put("certificationStatus", identityAuthenticationselect.getCertificationStatus());
return ajax; return ajax;
} }
@@ -69,8 +65,7 @@ public class SysLoginController
* @return 用户信息 * @return 用户信息
*/ */
@GetMapping("getInfo") @GetMapping("getInfo")
public AjaxResult getInfo() public AjaxResult getInfo() {
{
SysUser user = SecurityUtils.getLoginUser().getUser(); SysUser user = SecurityUtils.getLoginUser().getUser();
// 角色集合 // 角色集合
Set<String> roles = permissionService.getRolePermission(user); Set<String> roles = permissionService.getRolePermission(user);
@@ -89,8 +84,7 @@ public class SysLoginController
* @return 路由信息 * @return 路由信息
*/ */
@GetMapping("getRouters") @GetMapping("getRouters")
public AjaxResult getRouters() public AjaxResult getRouters() {
{
Long userId = SecurityUtils.getUserId(); Long userId = SecurityUtils.getUserId();
List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId); List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
return AjaxResult.success(menuService.buildMenus(menus)); return AjaxResult.success(menuService.buildMenus(menus));
@@ -1,8 +1,8 @@
package com.ruoyi.web.controller.wisdomarbitrate; package com.ruoyi.web.controller.wisdomarbitrate;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.CaseApplication;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication; import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService; import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -19,35 +19,22 @@ public class IdentityAuthenticationController extends BaseController {
private IdentityAuthenticationService identityAuthenticationService; private IdentityAuthenticationService identityAuthenticationService;
/** /**
* 查询身份认证EIDtoken * 获取EIDtoken
*/ */
@PostMapping("/selectIdentityAuthenticaEIDtoken") @PostMapping("/selectIdentityAuthenticaEIDtoken")
public AjaxResult selectIdentityAuthenticaEIDtoken() public AjaxResult selectIdentityAuthenticaEIDtoken() {
{ JSONObject tokenResult = identityAuthenticationService.selectIdentityAuthenticaEIDtoken();
IdentityAuthentication ientityAuthentication = identityAuthenticationService.selectIdentityAuthenticaEIDtoken(); return success(tokenResult);
return success(ientityAuthentication);
} }
/** /**
* 查询身份认证结果 * 小程序人脸核身后查询身份认证结果
*/ */
@PostMapping("/selectIdentityAuthenticaRespon") @PostMapping("/selectIdentityAuthenticaRespon")
public AjaxResult selectIdentityAuthenticaRespon(@Validated @RequestBody IdentityAuthentication ientityAuthentication) public AjaxResult selectIdentityAuthenticaRespon(@Validated @RequestBody IdentityAuthentication ientityAuthentication) {
{ AjaxResult checkResult = identityAuthenticationService.selectIdentityAuthenticaRespon(ientityAuthentication);
String username = this.getUsername(); return checkResult;
Long userId = this.getUserId();
ientityAuthentication.setUserId(userId);
ientityAuthentication.setUserName(username);
IdentityAuthentication ientityAuthenticationRes = identityAuthenticationService.selectIdentityAuthenticaRespon( ientityAuthentication);
return success(ientityAuthenticationRes);
} }
} }
@@ -166,4 +166,4 @@ identityAuthentication:
credentialSecretId: AKID3xfHgroY4MQHvLXUXMwIQL1UjmbBX1Tv credentialSecretId: AKID3xfHgroY4MQHvLXUXMwIQL1UjmbBX1Tv
credentialSecretKey: INDrIXcT8YmomZBcsy0oNirnU0LTN4X7 credentialSecretKey: INDrIXcT8YmomZBcsy0oNirnU0LTN4X7
merchantId: 0NSJ2309281116194321 merchantId: 0NSJ2309281116194321
privateKeyHexDecodeinfo: MHcCAQEEIEw7MRv3uYlpmU6Fko4GlXSh6Vd38k0cUQZ5zDwvRg+voAoGCCqBHM9VAYItoUQDQgAEUdxIAWhGg4LUXf1GoPdb8XMbGudpexPQCuaaRi9BCnNbpaF1kcwRhhsBKvop9ZmW/nOz4wQ1r/iIEOrc9qCXgQ== privateKeyHexDecodeinfo: 4c3b311bf7b98969994e85928e069574a1e95777f24d1c510679cc3c2f460faf
+3 -3
View File
@@ -136,15 +136,15 @@
<dependency> <dependency>
<groupId>com.tencentcloudapi</groupId> <groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java</artifactId> <artifactId>tencentcloud-sdk-java</artifactId>
<version>3.1.270</version> <version>3.1.876</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tencentcloudapi</groupId> <groupId>com.tencentcloudapi</groupId>
<artifactId>tencentcloud-sdk-java-faceid</artifactId> <artifactId>tencentcloud-sdk-java-faceid</artifactId>
<version>3.1.871</version> <version>3.1.875</version>
</dependency> </dependency>
<!--用户信息解密-->
<dependency> <dependency>
<groupId>cn.hutool</groupId> <groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId> <artifactId>hutool-all</artifactId>
@@ -1,15 +1,34 @@
package com.ruoyi.wisdomarbitrate.service; package com.ruoyi.wisdomarbitrate.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication; import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
public interface IdentityAuthenticationService { public interface IdentityAuthenticationService {
IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication); IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication);
/**
* 检查是否已经认证的用户
*
* @param identityAuthentication
* @return
*/
String checkIsAuthentication(IdentityAuthentication identityAuthentication);
IdentityAuthentication selectIdentityAuthenticaEIDtoken(); /**
* 获取Eidtoken
*
* @return
*/
JSONObject selectIdentityAuthenticaEIDtoken();
IdentityAuthentication selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication); /**
* 小程序人脸核身后查询身份认证结果
*
* @param ientityAuthentication
* @return
*/
AjaxResult selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication);
} }
@@ -1,27 +1,27 @@
package com.ruoyi.wisdomarbitrate.service.impl; package com.ruoyi.wisdomarbitrate.service.impl;
import cn.hutool.core.codec.Base64;
import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.SM2; import cn.hutool.crypto.asymmetric.SM2;
import cn.hutool.crypto.symmetric.SymmetricCrypto; import cn.hutool.crypto.symmetric.SymmetricCrypto;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.exceptions.TradeException; import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication; import com.ruoyi.wisdomarbitrate.domain.IdentityAuthentication;
import com.ruoyi.wisdomarbitrate.mapper.IdentityAuthenticationMapper; import com.ruoyi.wisdomarbitrate.mapper.IdentityAuthenticationMapper;
import com.ruoyi.wisdomarbitrate.service.ICaseApplicationService;
import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService; import com.ruoyi.wisdomarbitrate.service.IdentityAuthenticationService;
import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.faceid.v20180301.FaceidClient; import com.tencentcloudapi.faceid.v20180301.FaceidClient;
import com.tencentcloudapi.faceid.v20180301.models.*; import com.tencentcloudapi.faceid.v20180301.models.GetEidResultRequest;
import com.tencentcloudapi.faceid.v20180301.models.GetEidResultResponse;
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenRequest;
import com.tencentcloudapi.faceid.v20180301.models.GetEidTokenResponse;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -29,12 +29,7 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.FileInputStream; import java.util.Date;
import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Service @Service
public class IdentityAuthenticationServiceImpl implements IdentityAuthenticationService { public class IdentityAuthenticationServiceImpl implements IdentityAuthenticationService {
@@ -58,9 +53,9 @@ public class IdentityAuthenticationServiceImpl implements IdentityAuthenticatio
@Override @Override
public IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication) { public IdentityAuthentication selectIdentityAuthentication(IdentityAuthentication identityAuthentication) {
IdentityAuthentication identityAuthenticationselect = identityAuthenticationMapper.selectIdentityAuthentication(identityAuthentication); IdentityAuthentication identityAuthenticationselect = identityAuthenticationMapper.selectIdentityAuthentication(identityAuthentication);
if(identityAuthenticationselect!=null){ if (identityAuthenticationselect != null) {
identityAuthenticationselect.setCertificationStatusName("已身份认证"); identityAuthenticationselect.setCertificationStatusName("已身份认证");
}else { } else {
IdentityAuthentication identityAuthenticationselectnew = new IdentityAuthentication(); IdentityAuthentication identityAuthenticationselectnew = new IdentityAuthentication();
identityAuthenticationselectnew.setCertificationStatusName("未身份认证"); identityAuthenticationselectnew.setCertificationStatusName("未身份认证");
identityAuthenticationselectnew.setCertificationStatus(0); identityAuthenticationselectnew.setCertificationStatus(0);
@@ -70,86 +65,157 @@ public class IdentityAuthenticationServiceImpl implements IdentityAuthenticatio
} }
/**
* 检查是否已经认证的用户
*
* @param identityAuthentication
* @return
*/
@Override @Override
public IdentityAuthentication selectIdentityAuthenticaEIDtoken() { public String checkIsAuthentication(IdentityAuthentication identityAuthentication) {
IdentityAuthentication identityAuthentication = new IdentityAuthentication(); IdentityAuthentication identityAuthenticationselect = identityAuthenticationMapper.selectIdentityAuthentication(identityAuthentication);
try{ if (identityAuthenticationselect != null) {
Credential authenti = new Credential(credentialSecretId, credentialSecretKey); return "1";
HttpProfile httpProfileIdenAuth = new HttpProfile(); } else {
httpProfileIdenAuth.setEndpoint("faceid.tencentcloudapi.com"); return "0";
ClientProfile clientInv= new ClientProfile(); }
clientInv.setHttpProfile(httpProfileIdenAuth);
FaceidClient clientIdenAuth = new FaceidClient(authenti, "", clientInv);
// 实例化一个请求对象
GetEidTokenRequest reqest = new GetEidTokenRequest();
//设置请求参数
reqest.setMerchantId(merchantId);
GetEidTokenResponse respIdenAuth = clientIdenAuth.GetEidToken(reqest);
String respJSON = GetEidTokenResponse.toJsonString(respIdenAuth);
JSONObject objJSON = JSON.parseObject(respJSON);
String eidToken = objJSON.getString("EidToken");
String requestId = objJSON.getString("RequestId");
identityAuthentication.setEidToken(eidToken);
}catch (TencentCloudSDKException e) {
log.error("获取Eidtoke异常:", e);
throw new RuntimeException("获取Eidtoke异常");
} }
return identityAuthentication; /**
* 获取EIDtoken
*
* @return
*/
@Override
public JSONObject selectIdentityAuthenticaEIDtoken() {
JSONObject objJSON = new JSONObject();
objJSON.put("EidToken", "");
try {
Credential cred = new Credential(credentialSecretId, credentialSecretKey);
// 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("faceid.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
FaceidClient client = new FaceidClient(cred, "", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
GetEidTokenRequest req = new GetEidTokenRequest();
req.setMerchantId(merchantId);
// 返回的resp是一个GetEidTokenResponse的实例,与请求对象对应
GetEidTokenResponse resp = client.GetEidToken(req);
// 输出json格式的字符串回包
String respJSON = GetEidTokenResponse.toJsonString(resp);
objJSON = JSON.parseObject(respJSON);
} catch (TencentCloudSDKException e) {
System.out.println(e.toString());
System.out.println("获取Eidtoken失败");
}
return objJSON;
} }
/**
* 解密用户信息
*/
public JSONObject DecodeUserInfo(String deskey, String userInfo) {
JSONObject parse = null;
try {
byte[] desKeyBytes = Base64.decode(deskey);
final SM2 sm2 = new SM2(privateKeyHexDecodeinfo, null, null);
sm2.usePlainEncoding();
byte[] sm4KeyBytes = sm2.decrypt(desKeyBytes);
SymmetricCrypto sm4 = SmUtil.sm4(sm4KeyBytes);
byte[] plaintext = sm4.decrypt(Base64.decode(userInfo));
if (plaintext != null && plaintext.length > 0) {
String s = new String(plaintext);
parse = JSON.parseObject(s);
}
} catch (Exception e) {
System.out.println(e.toString());
}
return parse;
}
/**
* 小程序人脸核身后查询身份认证结果
*
* @param ientityAuthentication
* @return
*/
@Override @Override
@Transactional @Transactional
public IdentityAuthentication selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication) { public AjaxResult selectIdentityAuthenticaRespon(IdentityAuthentication ientityAuthentication) {
String eidToken = ientityAuthentication.getEidToken(); String eidToken = ientityAuthentication.getEidToken();
Long userId = ientityAuthentication.getUserId();
String userName = ientityAuthentication.getUserName();
IdentityAuthentication IdentityAuthenticationRespon = new IdentityAuthentication();
IdentityAuthentication IdentityAuthenticationResult = new IdentityAuthentication();
if(StringUtils.isNotEmpty(eidToken)){
try{
Credential authenti = new Credential(credentialSecretId, credentialSecretKey);
HttpProfile httpProfileIdenAuth = new HttpProfile();
httpProfileIdenAuth.setEndpoint("faceid.tencentcloudapi.com");
ClientProfile clientInv= new ClientProfile();
clientInv.setHttpProfile(httpProfileIdenAuth);
FaceidClient clientIdenAuth = new FaceidClient(authenti, "", clientInv);
// 实例化一个请求对象
GetEidResultRequest reqest = new GetEidResultRequest();
//设置请求参数
reqest.setEidToken(eidToken);
// reqest.setInfoType("1"); try {
// reqest.setInfoType("13"); Credential cred = new Credential(credentialSecretId, credentialSecretKey);
// reqest.setInfoType("2"); // 实例化一个http选项,可选的,没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("faceid.tencentcloudapi.com");
// 实例化一个client选项,可选的,没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
FaceidClient client = new FaceidClient(cred, "", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
GetEidResultRequest req = new GetEidResultRequest();
req.setEidToken(eidToken);
// 返回的resp是一个GetEidResultResponse的实例,与请求对象对应
GetEidResultResponse resp = client.GetEidResult(req);
// 输出json格式的字符串回包
String s = GetEidResultResponse.toJsonString(resp);
JSONObject objJSON = JSON.parseObject(s);
//查看是否核验成功
JSONObject text = objJSON.getJSONObject("Text");
if (text != null) {
Integer comparestatus = text.getInteger("Comparestatus");
if (comparestatus != null && comparestatus == 0) {
JSONObject eidInfo = objJSON.getJSONObject("EidInfo");
if (eidInfo != null) {
String desKey = eidInfo.getString("DesKey");
String userInfo = eidInfo.getString("UserInfo");
//1.解密用户的信息
JSONObject info = DecodeUserInfo(desKey, userInfo);
if (info != null) {
String idcardno = info.getString("idnum");
String name = info.getString("name");
//2.在用户认证表中插入用户认证记录
LoginUser loginUser = SecurityUtils.getLoginUser();
IdentityAuthentication authentication = new IdentityAuthentication();
/**
* 用户名
* 用户名id
* 姓名
* 身份证号
* 认证时间
* 认证状态0表示成功
* 请求id
*/
authentication.setUserName(loginUser.getUsername());
authentication.setUserId(loginUser.getUserId());
authentication.setName(name);
authentication.setIdentityNo(idcardno);
authentication.setCertificationTime(new Date());
authentication.setCertificationStatus(0);
authentication.setRequestId(objJSON.getString("RequestId"));
try {
identityAuthenticationMapper.insertIdentityAuthentication(authentication);
} catch (Exception e) {
System.out.println("认证记录新增失败");
}
//获得身份认证结果 }
GetEidResultResponse respIdenAuth = clientIdenAuth.GetEidResult(reqest);
String respJSON = GetEidResultResponse.toJsonString(respIdenAuth);
JSONObject objJSON = JSON.parseObject(respJSON);
IdentityAuthenticationRespon.setCertificationStatus(1);
IdentityAuthenticationRespon.setUserName(userName);
IdentityAuthenticationRespon.setUserId(userId);
JSONObject objEidInfo = JSON.parseObject(objJSON.getString("EidInfo")); }
// identityAuthenticationMapper.insertIdentityAuthentication(IdentityAuthenticationRespon); }
IdentityAuthenticationResult.setCertificationStatus(1); }
IdentityAuthenticationResult.setCertificationStatusName("认证成功"); return AjaxResult.success();
} catch (TencentCloudSDKException e) { } catch (TencentCloudSDKException e) {
log.error("认证失败:", e); System.out.println(e.toString());
throw new RuntimeException("认证失败");
} }
return null;
} }
return IdentityAuthenticationResult;
}
} }